码迷,mamicode.com
首页 > 其他好文 > 详细

第四章 学习小结

时间:2019-04-14 16:18:25      阅读:94      评论:0      收藏:0      [点我收藏+]

标签:isp   closed   style   cout   space   ace   包含   display   clu   

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

如果是用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中的具体实现。

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

第四章 学习小结

标签:isp   closed   style   cout   space   ace   包含   display   clu   

原文地址:https://www.cnblogs.com/dengyanlin321/p/10705293.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!