题意是判断一字符串中前缀和后缀一样的位置,例如:abcabc中,前缀abc有一样的后缀abc,abcabc本身也是一个前缀,同时也是后缀
这就与next数组的意义联系起来了。
假设next[len] = k,也即:s[1,k] = s[len-k+1,len]此时s[1,k]是前缀后缀。
处理完next[len]后跳转到next[k+1],用这种方法可以得到所有的前缀后缀。
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
#define max_n 400005
char str[max_n];
int next[max_n];
int ans[max_n];
void getnext()
{
int i = 0;
int j = -1;
next[0] = -1;
int len = strlen(str);
while(i<len)
{
if(j==-1||str[j]==str[i])
{
i++;
j++;
next[i] = j;
}
else
j = next[j];
}
}
int main()
{
while(~scanf("%s",str))
{
int len = strlen(str);
getnext();
int t = -1;
ans[++t] = len;
while(next[len]>0)
{
ans[++t] = next[len];
len = next[len];
}
for(int i=t;i>=0;i--)
printf("%d ",ans[i]);
printf("\n");
}
return 0;
}
本文介绍了一种用于寻找字符串中所有前缀与后缀相等位置的算法实现,通过构建next数组来高效地找到这些位置,并提供了一个C++示例程序。
555

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



