那位实现过kmp算法?该怎么处理
那位实现过kmp算法?
不想自己实现了,那位大侠有成熟的实现?共享一下?
非常感谢
------解决方案--------------------
//字符串模式匹配:KMP算法
#include <iostream>
#include <string>
using namespace std;
int* get_next(char *T);
void main()
{
char* s= "hhhsauhduwdh ";
char* t= "hdu ";
int i=0;
int j=0;
int S=strlen(s);
int T=strlen(t);
int *next=get_next(t);
while(i <S&&j <T)
{//判定条件i <S&&j <T说明:字符串数组下标从0开始,到字符串长度减1结束
if(j==0||s[i]==t[j])
{i++;j++;}//继续向后比较字符
else
j=next[j];//模式串向后移动
}
if(j> =T)
cout < <i-T+1 < <endl;//匹配成功
else
cout < < "0 " < <endl;//匹配失败
}
//KMP算法克服了主串中i指针的回朔问题
//求next值的算法
//06.05.07 get_next函数调试时仍有问题。编译时通过,运行时出错。
//
int* get_next(char *T)
{//返回指向next数组首地址的指针
int i=1;
int next[100],*r=next;
next[1]=0;
int j=0;
while(i <strlen(T))
{
if(j==0||T[i]==T[j])
{i++;j++;next[i]=j;}
else j=next[j];
}//while
return r;
}//get_next
------解决方案--------------------
http://en.wikipedia.org/wiki/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm
------解决方案--------------------
void GetNext(char* T, int* next)
{
int j = 0;
int k = -1;
int Len = strlen(T);
while (j < Len)
if ((k == -1) || (T[k] == T[j]))
{
j++;
k++;
next[j-1] = k + 1;
}
else
k = next[k] - 1;
}
------解决方案--------------------
哪本数据结构书上都有吧,写得小巧玲珑的。
------解决方案--------------------
#include <stdio.h>
#include <string.h>
void strNext(const char *modstr,int next[])
{
int i = 1;
int j = 0;
next[0] = 0;
while(i < (int)strlen(modstr))
{
if(modstr[i]==modstr[j])
{
next[i] = j;i++;j++;
}
else if(j == 0)
{
next[i] = 0;
i++;
}
else
{
j = next[i];
}
}
return;
}
int main()
{
int next[20];
int i = 0,j = 0;
char *compareString = "bacbbacbaabcca ";
char *modelString = "bacba ";
memset(next,0,sizeof(next));
strNext(modelString,next);
while(i < (int)strlen(compareString))
{
if(j == (int)strlen(modelString))
{
printf( "there exist a str\n ");
return 0;
}
if(compareString[i] == modelString[j]) {i++;j++;}
else
{j = next[j];i++;}
}
printf( "there isn 't exist a str\n ");
return 0;
}
------解决方案--------------------
int pi[10001];
void next(char *s){
int m=strlen(s);
pi[0]=-1;
int k=-1;
for(int q=1;q<m;q++){
while(k >= 0 && s[k+1]!=s[q])
k=pi[k];
if(s[k+1] == s[q])
k++;
pi[q]=k;
}
}
int
KMP(char *s, char *p) {
int count=0;
int n =strlen(s);
int m = strlen(p);
不想自己实现了,那位大侠有成熟的实现?共享一下?
非常感谢
------解决方案--------------------
//字符串模式匹配:KMP算法
#include <iostream>
#include <string>
using namespace std;
int* get_next(char *T);
void main()
{
char* s= "hhhsauhduwdh ";
char* t= "hdu ";
int i=0;
int j=0;
int S=strlen(s);
int T=strlen(t);
int *next=get_next(t);
while(i <S&&j <T)
{//判定条件i <S&&j <T说明:字符串数组下标从0开始,到字符串长度减1结束
if(j==0||s[i]==t[j])
{i++;j++;}//继续向后比较字符
else
j=next[j];//模式串向后移动
}
if(j> =T)
cout < <i-T+1 < <endl;//匹配成功
else
cout < < "0 " < <endl;//匹配失败
}
//KMP算法克服了主串中i指针的回朔问题
//求next值的算法
//06.05.07 get_next函数调试时仍有问题。编译时通过,运行时出错。
//
int* get_next(char *T)
{//返回指向next数组首地址的指针
int i=1;
int next[100],*r=next;
next[1]=0;
int j=0;
while(i <strlen(T))
{
if(j==0||T[i]==T[j])
{i++;j++;next[i]=j;}
else j=next[j];
}//while
return r;
}//get_next
------解决方案--------------------
http://en.wikipedia.org/wiki/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm
------解决方案--------------------
void GetNext(char* T, int* next)
{
int j = 0;
int k = -1;
int Len = strlen(T);
while (j < Len)
if ((k == -1) || (T[k] == T[j]))
{
j++;
k++;
next[j-1] = k + 1;
}
else
k = next[k] - 1;
}
------解决方案--------------------
哪本数据结构书上都有吧,写得小巧玲珑的。
------解决方案--------------------
#include <stdio.h>
#include <string.h>
void strNext(const char *modstr,int next[])
{
int i = 1;
int j = 0;
next[0] = 0;
while(i < (int)strlen(modstr))
{
if(modstr[i]==modstr[j])
{
next[i] = j;i++;j++;
}
else if(j == 0)
{
next[i] = 0;
i++;
}
else
{
j = next[i];
}
}
return;
}
int main()
{
int next[20];
int i = 0,j = 0;
char *compareString = "bacbbacbaabcca ";
char *modelString = "bacba ";
memset(next,0,sizeof(next));
strNext(modelString,next);
while(i < (int)strlen(compareString))
{
if(j == (int)strlen(modelString))
{
printf( "there exist a str\n ");
return 0;
}
if(compareString[i] == modelString[j]) {i++;j++;}
else
{j = next[j];i++;}
}
printf( "there isn 't exist a str\n ");
return 0;
}
------解决方案--------------------
int pi[10001];
void next(char *s){
int m=strlen(s);
pi[0]=-1;
int k=-1;
for(int q=1;q<m;q++){
while(k >= 0 && s[k+1]!=s[q])
k=pi[k];
if(s[k+1] == s[q])
k++;
pi[q]=k;
}
}
int
KMP(char *s, char *p) {
int count=0;
int n =strlen(s);
int m = strlen(p);