原題:lintcode題目
字符串查找(又稱查找子字符串),是字符串操作中一個很有用的函數。你的任務是實現這個函數。
對於一個給定的 source 字符串和一個 target 字符串,你應該在 source 字符串中找出 target 字符串出現的第一個位置(從0開始)。
如果不存在,則返回 -1
。
字符串匹配最常見的就是kmp算法,不過kmp算法對於我來說過於的複雜,我在網上查找,發現了更爲簡單,易於理解的sunday算法
Sunday算法是Daniel M.Sunday於1990年提出的字符串模式匹配。其核心思想是:在匹配過程中,模式串發現不匹配時,算法能跳過儘可能多的字符以進行下一步的匹配,從而提高了匹配效率。
int strStr(const char *source, const char *target) {
if(source == NULL || target == NULL)
return -1;
int i,j,pos=0;
int len_s,len_d;
int next[256]={0};//next數組保存在target中出現字符順序,這樣在匹配的時候不需要重新查找,
len_d=strlen(target);
for(j=0;j<256;++j) //初始化next數組,如果next沒有在target中出現,next爲target長度+1,即跳過整個target長度
next[j]=len_d + 1;
for(j=0;j<len_d;++j) //設置next數組
next[target[j]-'0']=j+1; <span style="white-space:pre"> </span>//next的字符在target出現,者next值爲target內的順序+1
while( pos<(len_s-len_d+1) ) //遍歷原串
{
i=pos;
for(j=0;j<len_d;++j,++i) //比較
{
if(source[i]!=target[j]) //一旦不匹配,原串就按照next跳轉
{
pos+=next[source[pos+1]-'0'];//如果下一個字符在target出現,則跳過next的值,否則跳過這個target長度
break;
}
}
if(j==len_d)
return pos;
}
return -1;
}