第四章 学习小结

我想谈谈我写模式匹配题时的心得体会:

如果是用BF算法我觉得的这道题真的非常简单,我是用的BF算法, 一开始我把string和书上的sstring搞混淆了

就像下图的代码所示:

S.[i]==T.[j]
S.length
View Code

但是string是头文件<cstring>包含的所以应该打成这样

S[i]==T[j]
S.length()
View Code

老师上课时讲过这个,但我当时没有认真记下来,课后翻书,就直接按书上的打了,所以就出现错误。后来查阅了相关资料才修改过来了

因为用的是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
}
View Code

这样匹配失败时就会返回-1,不能直接输出,于是我在主函数中做了如下修改:

if(e==-1)//匹配失败输出0
{
 cout<<"0";

}
View Code

我的整体函数如下图所示:

#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;
}
View Code

在提交完这份代码后,我仔细看了一下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;
}
View Code

希望有时间能再研究一下KMP算法在string中的具体实现。

上次制定的目标有去实践。

猜你喜欢

转载自www.cnblogs.com/dengyanlin321/p/10705293.html