| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 551 人关注过本帖
标题:求字符串next值的完整程序,能够在VC++里面运行的
只看楼主 加入收藏
James429
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2012-12-17
结帖率:0
收藏
已结贴  问题点数:1 回复次数:3 
求字符串next值的完整程序,能够在VC++里面运行的
int *findNext(String P) // 计算向量N
{                 
      int m = P.length();                   //  m为模板P的长度
      assert( m > 0);                 //  若m=0,退出
      int *next = new  int[m];          //  动态存储区开辟整数数组
      assert( next != 0);                  // 若开辟存储区域失败,退出
      next[0] = -1;
      int i = 0;
      int k = -1;
      while (i < m-1)
      {
         while (k>= 0 && P [i] != P[k])
               k= next[k];
                i++; k++;
         next[i] = k;
       }         
     return next;
 }
字符串是abcabcad,程序还少那些东西?
搜索更多相关主题的帖子: 字符串 next 动态 
2012-12-17 20:53
crystall
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:7
帖 子:184
专家分:809
注 册:2012-12-1
收藏
得分:1 
回复 楼主 James429
第一: 你代码没贴全
第二: 请问你的代码自己有编译过吗? 如果有,编译能通过吗?
2012-12-18 11:05
James429
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2012-12-17
收藏
得分:0 
回复 2楼 crystall
我不知道代码还少哪些部分,所以没贴上去。至于运行,代码不全应该运行不了啊。求助了!
2012-12-18 20:54
James429
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2012-12-17
收藏
得分:0 
我终于在网上找到篇比较详细的讲解的,但是一运行就被电脑停止了,不值得为啥http://blog.这个是作者网址。代码我发下,谢谢各位!
void get_nextval(const char *T, int next[])
{
       // 求模式串T的next函数值并存入数组 next。
       int j = 0, k = -1;
       next[0] = -1;
       while ( T[j/*+1*/] != '/0' )
       {
              if (k == -1 || T[j] == T[k])
              {
                     ++j; ++k;
                     if (T[j]!=T[k])
                            next[j] = k;
                     else
                            next[j] = next[k];
              }// if
              else
                     k = next[k];
       }// while
    ////这里是我加的显示部分
   // for(int i=0;i<j;i++)
       //{
       //     cout<<next[i];
       //}
       //cout<<endl;
}// get_nextval 
#include <iostream.h>
#include <string.h>
int KMP(const char *Text,const char* Pattern) //const 表示函数内部不会改变这个参数的值。
{
       if( !Text||!Pattern|| Pattern[0]=='/0' || Text[0]=='/0' )//
              return -1;//空指针或空串,返回-1。
       int len=0;
       const char * c=Pattern;
       while(* c++!='/0')//移动指针比移动下标快。
       {     
              ++len;//字符串长度。
       }
       int *next=new int[len+1];
       get_nextval(Pattern,next);//求Pattern的next函数值
   
       int index=0,i=0,j=0;
       while(Text[i]!='/0' && Pattern[j]!='/0' )
       {
              if(Text[i]== Pattern[j])
              {
                     ++i;// 继续比较后继字符
                     ++j;
              }
              else
              {
                     index += j-next[j];
                     if(next[j]!=-1)
                            j=next[j];// 模式串向右移动
                     else
                     {
                            j=0;
                            ++i;
                     }
              }
       }//while
   
       delete []next;
       if(Pattern[j]=='/0')
              return index;// 匹配成功
       else
              return -1;      
}
int main()//abCabCad
{
       char* text="bababCabCadcaabcaababcbaaaabaaacababcaabc";
    char*pattern="adCadCad";
       //getNext(pattern,n);
    //get_nextval(pattern,n);
      cout<<KMP(text,pattern)<<endl;
       return 0;
}
2012-12-18 21:00
快速回复:求字符串next值的完整程序,能够在VC++里面运行的
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.034058 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved