BF算法:O(n*m)
代码:
int index(string S,string T)//返回主串S中与模式串T匹配的字符序列第一个字符的序号;
{
int i=1,j=1;
while(i<=S.length()&&j<=T.length())
{
if(S[i]==T[j])
i++,j++;
else
i=i-j+1,j=0;
}
if(j>T.length()) return i-T.length();
else return 0;
}
KMP算法:O(n+m)
核心思想:利用已经得到的部分匹配信息来进行后面的匹配过程;在整个匹配过程中,i指针没有回溯;
做法:
第一步构造next[j]函数,next[j]的值:表示当模式中第j个字符与主串中相应字符“失配”时,在模式中需要和主串中该字符进行比较的字符的位置;
例:
j | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
模式串 | a | b | a | a | b | c | a | c |
next[j] | -1 | 0 | 0 | 1 | 1 | 2 | 0 | 1 |
代码:(即求上例j的next[j]函数)
void getnext(string T,int next[])
{
int i=0,next[0]=-1,j=-1;
while(i<T.length())
{
if(j==-1||T[i]==T[j])
{
i++;j++
next[i]=j;
}
else
j=next[j];
}
}
第二步进行匹配即可;
代码:
int index_kmp(string S,string T)
{
int i=0,j=0;
while(i<S.length()&&j<T.length())
{
if(j==-1||S[i]==T[j])
i++,j++;
else
j=next[j];
}
if(j==T.length()) return i-T.length();
else return 0;
}