我想谈谈我写模式匹配题时的心得体会:
如果是用BF算法我觉得的这道题真的非常简单,我是用的BF算法, 一开始我把string和书上的sstring搞混淆了
就像下图的代码所示:
S.[i]==T.[j] S.length
但是string是头文件<cstring>包含的所以应该打成这样
S[i]==T[j] S.length()
老师上课时讲过这个,但我当时没有认真记下来,课后翻书,就直接按书上的打了,所以就出现错误。后来查阅了相关资料才修改过来了
因为用的是string所以我的BF算法函数如下:
int Index_BF(string S, string T)//进行模式匹配 { int i,j; i=0;j=0; while(i<S.length()&&j<T.length())//当子串和主串都不为空时才进行匹配 { if(S[i]==T[j]) {++i;++j;}//匹配成功后,将进行匹配的字符加一 else {i=i-j+1;j=0; }//指针后退重新开始匹配 } if(j>=T.length()) return i+1-T.length();//匹配成功返回匹配的第一个字符 else return -1;//匹配失败返回-1 }
这样匹配失败时就会返回-1,不能直接输出,于是我在主函数中做了如下修改:
if(e==-1)//匹配失败输出0 { cout<<"0"; }
我的整体函数如下图所示:
#include <iostream> #include <string> using namespace std; int Index_BF(string S, string T)//进行模式匹配 { int i,j; i=0;j=0; while(i<S.length()&&j<T.length())//当子串和主串都不为空时才进行匹配 { if(S[i]==T[j]) {++i;++j;}//匹配成功后,将进行匹配的字符加一 else {i=i-j+1;j=0; }//指针后退重新开始匹配 } if(j>=T.length()) return i+1-T.length();//匹配成功返回匹配的第一个字符 else return -1;//匹配失败返回-1 } int main() { string S,T; cin>>S; cin>>T; int e; e=Index_BF(S,T); if(e==-1)//匹配失败输出0 { cout<<"0"; } else cout<<e; return 0; }
在提交完这份代码后,我仔细看了一下KMP算法,但还是有点看不明白,我想在我之前代码的基础上尝试KMP算法,可是next函数的值还是不明白着么算来的,书上只提供了sstring的相应算法,string的具体算法还要重新研究,我做了一些改变后提交到PTA上只有9分,实在搞不明白就放弃了KMP算法。具体改变如下:
#include <iostream> #include <string> using namespace std; int Index_KMP(string S, string T) { int i,j; i=0;j=0; int next[100000]; int a,b; a=0;next[0]=0;b=0; while(a<T.length()) { if(b==0||T[a]==T[b]) {++a;++b;next[a]=b; } else b=next[b]; } while(i<S.length()&&j<T.length()) { if(j==-1||S[i]==T[j]) {++i;++j; }// else {j=next[j]-1; }// } if(j>=T.length()) return i+1-T.length(); else return -1; } int main() { string S,T; cin>>S; cin>>T; int e; e=Index_KMP(S,T); if(e==-1) { cout<<"0"; } else cout<<e; return 0; }
希望有时间能再研究一下KMP算法在string中的具体实现。
上次制定的目标有去实践。
原文地址:https://www.cnblogs.com/dengyanlin321/p/10705293.html
时间: 2024-09-29 09:03:03