| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1427 人关注过本帖
标题:KMP还是不行啊,哎
只看楼主 加入收藏
Lupkid
Rank: 1
等 级:新手上路
帖 子:42
专家分:0
注 册:2007-10-18
收藏
 问题点数:0 回复次数:11 
KMP还是不行啊,哎
#include "iostream"
#include "stdlib.h"
#include "stdio.h"
#define N 255
using namespace std;
typedef char SString[N+1];
SString T,S;
void GetNext(SString &T,int *next) {
int i=1,j=0;
next[i]=0;
while(i<T[0])
if(j==0||T[i]==T[j]){
++i;++j;
next[i]=j;}
else j=next[j];
}
int IndexKMP(SString &S,SString &T,int *next) {
int i=1,j=1;
while(i<S[0]||j<T[0])
if(j==0||S[i]==T[j]){
++i;++j;
}
else j=next[j];
if(j>T[0]) return i-T[0];
else return 0;
}
void all(SString &S){
int i=0,j=1;
if(S[j]!=NULL) i++;
S[0]=i;
}
void main(){
int k;
int next[N];
gets(&S[1]);
all(S);
gets(&T[1]);
all(T);
GetNext(T,next);
k=IndexKMP(S,T,next);
cout<<k;
}
搜索更多相关主题的帖子: KMP include std using 
2007-10-19 22:43
zxc1998
Rank: 1
等 级:新手上路
威 望:1
帖 子:133
专家分:0
注 册:2007-3-21
收藏
得分:0 
void all(SString &S){
int i=0,j=1;
if(S[j]!=NULL) i++;
S[0]=i;
}

while(S[j] != NULL) j++,i++;

粗心
2007-10-19 23:17
Lupkid
Rank: 1
等 级:新手上路
帖 子:42
专家分:0
注 册:2007-10-18
收藏
得分:0 
还是不行
2007-10-19 23:24
Lupkid
Rank: 1
等 级:新手上路
帖 子:42
专家分:0
注 册:2007-10-18
收藏
得分:0 
#include "iostream"
#include "stdlib.h"
#include "stdio.h"
#define N 255
using namespace std;
typedef char SString[N+1];
SString T,S;
void GetNext(SString &T,int *next) {
int i=1,j=0;
next[i]=0;
while(i<T[0])
if(j==0||T[i]==T[j]){
++i;++j;
next[i]=j;}
else j=next[j];
}
int IndexKMP(SString &S,SString &T,int *next) {
int i=1,j=1;
while(i<S[0]||j<T[0])
if(j==0||S[i]==T[j]){
++i;++j;
}
else j=next[j];
if(j>T[0]) return i-T[0];
else return 0;
}
void all(SString &S){
int i=0,j=1;
while(S[j] != NULL) {
j++,i++;
}
S[0]=i;
}
void main(){
int k;
int next[N];
gets(&S[1]);
all(S);
gets(&T[1]);
all(T);
GetNext(T,next);
k=IndexKMP(S,T,next);
cout<<k;
}


输入abcdabcde
abcde
输出是0
2007-10-19 23:29
zxc1998
Rank: 1
等 级:新手上路
威 望:1
帖 子:133
专家分:0
注 册:2007-3-21
收藏
得分:0 

typedef char SString[N+1];
SString T,S;
void GetNext(SString T,int *next) {
int i=1,j=0;
next[i]=0;
while(i<T[0])
if(j==0 || T[i]==T[j]){
++i;++j;
next[i]=j;
}
else j=next[j];
}

int IndexKMP(SString S,SString T,int *next) {
int i=1,j=1;
while(i<S[0]||j<T[0])
if(j==0||S[i]==T[j]){
++i;++j;
}
else j=next[j];
if(j>=T[0]) return i-T[0]+1;
else return 0;
}
void all(SString S){
int i=0,j=1;
while(S[j]!=NULL) j++,i++;
S[0]=i;
}
void main(){
int k;
int next1[N];
gets(&S[1]);
all(S);
gets(&T[1]);
all(T);
GetNext(T,next1);
k=IndexKMP(S,T,next1);
cout<<k;
}

2007-10-19 23:55
Lupkid
Rank: 1
等 级:新手上路
帖 子:42
专家分:0
注 册:2007-10-18
收藏
得分:0 

#include "iostream"
#include "stdlib.h"
#include "stdio.h"
#define N 255
using namespace std;
typedef char SString[N+1];
SString T,S;
void GetNext(SString T,int *next) {
int i=1,j=0;
next[i]=0;
while(i<T[0])
if(j==0 || T[i]==T[j]){
++i;++j;
next[i]=j;
}
else j=next[j];
}

int IndexKMP(SString S,SString T,int *next) {
int i=1,j=1;
while(i<S[0]||j<T[0])
if(j==0||S[i]==T[j]){
++i;++j;
}
else j=next[j];
if(j>=T[0]) return i-T[0]+1;
else return 0;
}
void all(SString S){
int i=0,j=1;
while(S[j]!=NULL) {
j++; i++;
}
S[0]=i;
}
void main(){
int k;
int next[N];
cout<<"请输入字符串S:"<<endl;
gets(&S[1]);
all(S);
cout<<"请输入字符串T:"<<endl;
gets(&T[1]);
all(T);
GetNext(T,next);
k=IndexKMP(S,T,next);
cout<<"从第";
cout<<k;
cout<<"个字符发现匹配"<<endl;
}

子串若在中间好象不行,会说程序有问题
例如情况

2007-10-20 00:32
Lupkid
Rank: 1
等 级:新手上路
帖 子:42
专家分:0
注 册:2007-10-18
收藏
得分:0 
回复:(Lupkid)KMP还是不行啊,哎
子串在中间不行,
abcabcdabcde
abcd
会弹出错误窗口.
2007-10-20 00:37
zxc1998
Rank: 1
等 级:新手上路
威 望:1
帖 子:133
专家分:0
注 册:2007-3-21
收藏
得分:0 
int IndexKMP(SString S,SString T,int *next) {
int i=1,j=1;
while(i<=S[0] && j<=T[0])
if(j==0||S[i]==T[j]){
++i;++j;
}
else j=next[j];
if(j>T[0]) return i-j+1;
else return 0;
}
2007-10-20 07:21
Lupkid
Rank: 1
等 级:新手上路
帖 子:42
专家分:0
注 册:2007-10-18
收藏
得分:0 

十分感谢你,书上的算法居然也有问题

2007-10-20 07:28
Lupkid
Rank: 1
等 级:新手上路
帖 子:42
专家分:0
注 册:2007-10-18
收藏
得分:0 

匹配可以,但怎么输出next的值有点不对
比如子串是abcdeabcdef


#include "iostream"
#include "stdlib.h"
#include "stdio.h"
#define N 255
using namespace std;
typedef char SString[N+1];
SString T,S;
void GetNext(SString T,int *next) {
int i=1,j=0;
next[i]=0;
while(i<T[0]){
if(j==0 || T[i]==T[j]){
++i;++j;
next[i]=j;
}
else j=next[j];
}
for(i=0;i<T[0];i++){
cout<<next[i+1];
cout<<" ";

}
cout<<endl;
}

int IndexKMP(SString S,SString T,int *next) {
int i=1,j=1;
while(i<=S[0] && j<=T[0])
if(j==0||S[i]==T[j]){
++i;++j;
}
else j=next[j];
if(j>T[0]) return (i-j+1);
else return 0;
}
void all(SString S){
int i=0,j=1;
while(S[j]!=NULL) {
j++; i++;
}
S[0]=i;
}
void main(){
int k,i;
int next[N];
cout<<"请输入字符串S:"<<endl;
gets(&S[1]);
all(S);
cout<<"请输入字符串T:"<<endl;
gets(&T[1]);
all(T);
cout<<"next值分别为:";
GetNext(T,next);
k=IndexKMP(S,T,next);
cout<<"在第";
cout<<k;
cout<<"个字符发现匹配"<<endl;
}

2007-10-20 08:19
快速回复:KMP还是不行啊,哎
数据加载中...
 
   



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

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