KMP算法中需要涉及到字符串的长,有时习惯使用string来存储字符串,在处理比较时容易出错,先看看正确写法
#include<bits/stdc++.h>
using namespace std;
void GetNext(int a[],string b)
{
a[0]=-1;
int i=0,j=-1;
while(i<(int)b.size()-1)
{
if (j==-1||b[i]==b[j])
{
i++;
j++;
a[i]=j;
}
else
{
j=a[j];
}
}
}
int Kmp(string a,string b)
{
int Next[1000]={0};
GetNext(Next,b);
int i=0,j=0;
while(i<(int)a.size()&&j<(int)b.size())
{
if (j==-1||b[j]==a[i])
{
i++;
j++;
}
else
{
j=Next[j];
}
}
if (j==(int)b.size())
return i-j;
return -1;
}
int main()
{
int sum=1;
string a,b;
while(1)
{
cin>>a>>b;
cout<<sum<<" ans: "<<Kmp(a,b)<<'\n';
sum++;
}
return 0;
}
注意到每一处使用size()函数时,都用int强制转换,其原因是size()返回uint,与int比较时会出错,详情参考:https://blog.csdn.net/liyunxin_c_language/article/details/106879326?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522170523975716777224483240%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=170523975716777224483240&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~rank_v31_ecpm-5-106879326-null-null.142^v99^pc_search_result_base3&utm_term=uint%E5%92%8Cint%E6%AF%94%E8%BE%83&spm=1018.2226.3001.4187
感兴趣的读者不妨试试将所有的强制转换删去,测试以下数据:
10010111011001111000100
00101
你会在debug时发现,计算机认为-1<5
我debug数据如下
输出是