#include<iostream>
using namespace std;
void get_next_biao(int next[],string s){ //得到next表
next[0]=-1;
next[1]=0;
for(int i=2;i<s.size();i++){ //制作next表,第三位开始
int j=0;
while(s[i-1]!=s[j]){j++;} //判断后缀最后一个字符是否存在于前缀中
if(j==i-1){next[i]=0;} //没有的话,就赋值next为0
else{
int data=0;
for(int k=j;k<=i-2;k++){
if(s[k]==s[i-1]){ //找到所有尾部符合与后缀尾部相等的前缀尾部下标,记作k
int num=-1;
for(int m=0;m<=k;m++){
if(s[i-1-m]==s[k-m]){
num++;
}
}
if(data<=num&&num==k){ //筛选满足等于后缀,且最长的前缀
data=num;
}
}
}
next[i]=data+1; //把重复元素长度记在next表中
}
}
}
int main(){
string l;
cin>>l;
int next[l.size()];
get_next_biao(next,l);
for(int i=0;i<l.size();i++){
cout<<next[i]<<" ";
}
}
//作者根本看不懂别人写的很短的获取next表的代码,只会堆if-else和for (o_o)"
测试结果:

--------------------------------------------------------------------------------------------------------------------------------
下面是别人的函数写的。。。KMP算法中next数组的计算(和前缀表的计算)_kmp算法next计算方法-优快云博客):
def calc_next(kmp_str, kmp_len):
kmp_next = [1]*kmp_len
kmp_next[0] = 0
for i in range(2, kmp_len):
for j in range(i-1, 0, -1):
if kmp_str[0:j] == kmp_str[i-j:i]:
kmp_next[i] = j + kmp_next[i]
break
return kmp_next
1115

被折叠的 条评论
为什么被折叠?



