朴素的字符串匹配算法需要n*m的时间复杂度。
KMP算法能够很好的解决字符串匹配问题。
int fail[n];//失败函数
void compute-fail()//s2为子字符串
{
fail[0]=-1;
k=-1;
for(i=1;i<n;i++)
{
while(k>-1&&s2[i]!=s2[k+1])k=fail[k];
if(s2[k+1]==s2[i])k=k+1;
fail[i]=k;
}
}
bool Kmp(string s1,string s2)//s1的长度为m,s2的长度为n
{
int i=0,j=0;
while(i<m&&j<n)
{
if(s1[i]==s2[j]){i++;j++;}
else
{
if(j==0)i++;
else j=fail[j-1]+1;
}
}
if(j>=n)return true;
else return false;
}
KMP算法能够很好的解决字符串匹配问题。
int fail[n];//失败函数
void compute-fail()//s2为子字符串
{
fail[0]=-1;
k=-1;
for(i=1;i<n;i++)
{
while(k>-1&&s2[i]!=s2[k+1])k=fail[k];
if(s2[k+1]==s2[i])k=k+1;
fail[i]=k;
}
}
bool Kmp(string s1,string s2)//s1的长度为m,s2的长度为n
{
int i=0,j=0;
while(i<m&&j<n)
{
if(s1[i]==s2[j]){i++;j++;}
else
{
if(j==0)i++;
else j=fail[j-1]+1;
}
}
if(j>=n)return true;
else return false;
}