poj 2752 Seek the…

本文详细阐述了KMP算法在解决字符串匹配问题时的高效应用,通过求解字符串的next数组,实现了快速匹配前缀等于后缀的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目大意:
   输入一个字符串然后输出所有前缀等于后缀的情况,并以其长度输出来。(字符串自身也是一种情况)

题目分析:
  kmp算法next数组的应用,先求出字符串的next数组,然后j=next[j]进行回溯(j为字符串的长度)。
ababcababababcabab,next[18]=9,整个字符串前缀和后缀相同的值为9,输出;然后前9个字符中寻找前缀等于后缀的情况,输出(next[9]=4,abab是前9个字符的后缀,同时也是整个字符串的后缀,因为前九个字符是整个字符串的后缀),以此类推。输出所有的结果。

题目代码:
#include
#include
 using namespace std;
 char str[400010];
 int next[400010];
 int result[400010];  //保存结果

 int main ()
 {
    int i,j;
    int sLen;
    int len;
    int k;
    int temp;

   while(cin>>str)    
    {


       sLen=strlen(str);

           next[0]=-1;   //求出next数组
           j=-1;
          for(i=1;i
           {
              while(j>=0&& str[j+1]!=str[i])
                j=next[j];

              if(str[j+1]==str[i])
                j=j+1;

                 next[i]=j;
           }


             k=0;                      //回溯初始化
             len=next[sLen-1];
             result[k]=sLen;

         while(len>=0)              //回溯next数组
         {


           k++;
          result[k]=len+1;      //字符串是从下标为0开始保存的,所以前面的个数要+1
          len=next[len];        


        }

    for(j=k;j>=0;j--)           //倒序输出
      cout<<result[j]<<"";
       cout<<endl;

    }

   return 0;
 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值