KMP算法求助

ithaibo 2013-03-30 08:58:59
求大神指导,出不来结果。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define maxsize 100
typedef struct {
char data[maxsize];
int length;
} SqString;
void GetNext(SqString t, int next[]) {
int j, k;
j = 0;
k = -1;
next[0] = -1;
while (j < t.length - 1) {
if (k == -1 || t.data[j] == t.data[k]) {
j++;
k++;
next[j] = k;
}
else
k=next[k];
}
}
int KMPIndex(SqString s, SqString t) {
int next[maxsize], i = 0, j = 0;
GetNext(t, next);
while(i<s.length&&j<t.length){
if(j==-1||s.data[i]==t.data[j]){
i++;
j++;
}
else
j=next[j];
}
if(j>=t.length)
return (i-t.length);
else
return(-1);
}
int main(void) {
SqString s, t;
int index;
puts("请输入目标串");
scanf(" %s",s.data);
puts("请输入模式串");
scanf(" %s",t.data);
index = KMPIndex(s, t);
printf("从第%d个开始,目标串中出现模式串\n", index);
return 0;
}
...全文
169 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
ithaibo 2013-04-01
  • 打赏
  • 举报
回复
谢谢了,我已经找出来了。粗心啊!main函数中缺少t.length=strlen(t.data);s.length=strlen(s.data);
shiter 2013-03-31
  • 打赏
  • 举报
回复
上面是vc6下面编译通过的,我看了半天也没找到你程序出错,你对着看看呀
shiter 2013-03-31
  • 打赏
  • 举报
回复


//下面是KMP模式匹配程序,各位可以用他验证。记得加入上面的函数
#include <StdAfx.h>
#include <iostream.h>
#include <string.h>
//using namespace std;
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 
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="bawcbabCabCadcaabcaababcbaaaaaaacababcaabc";
    char*pattern="wc";
	//getNext(pattern,n);
    //get_nextval(pattern,n);
	cout<<KMP(text,pattern)<<endl;
	getchar();
	//System("pause");
	return 0;
}
shiter 2013-03-31
  • 打赏
  • 举报
回复


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 
另一种写法,也差不多。
void getNext(const char* pattern,int next[])
{
       next[0]=   -1;
       int k=-1,j=0;
       while(pattern[j]  !=  '\0')
       {
              if(k!=  -1  &&  pattern[k]!=  pattern[j] )
                     k=next[k];
              ++j;++k;
              if(pattern[k]==  pattern[j])
                     next[j]=next[k];
              else
                     next[j]=k;
       }
       ////这里是我加的显示部分
   // for(int  i=0;i<j;i++)
       //{
       //     cout<<next[i];
       //}
       //cout<<endl;
}
下面是KMP模式匹配程序,各位可以用他验证。记得加入上面的函数
#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;
}

70,037

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧