第四章学习小结

一.  完成作业或实践时解决困难的经验分享

                 这一部分就主要说说作业一的思路吧

       在一开始准备用BF算法因为KMP还没有弄透,只知道大概的思路,但写起来会有些困难,后来认为有可能会导致运行超时,就去查阅资料,参考了大神写的KMP算法

     

1 char* chain(string str)
2 {
3     int size = str.length();
4     char *s;
5     s= new char[size];
6     strcpy(s, str.c_str());
7     return s;
8 }

      此处是通过将字符串化为字符数组以减少存储空间

 1 int kmp(string sstring, string pstring)
 2 {
 3     int *next = new int[pstring.length()];
 4     get_next(pstring, next);//得到 next[]数组
 5     char *s = chain(sstring), *p = chain(pstring); //转字符串为字符数组
 6     int m=0, n=0;
 7     int pos = 0;
 8     
 9     while( m<=sstring.length() || n<=pstring.length())
10     {
11         if( n == -1 || s[m] == p[n])
12         {
13             m++;
14             n++;
15         }
16         else { n = next[n]; }
17         if(n == pstring.length())
18         {//匹配成功 
19             pos = m-n+1;
20             break; 
21         }
22     } 
23     
24     return pos;
25     
26 } 

      这是KMP算法的主要代码,接下来用图解

在此图中,1-2(包括1,2)的元素与3-4(包括3,4)的元素一一对应相同,然后发现2之后的A与4之后的B不同,KMP算法只需将下面一个字符串全部后移直至将3对应到第一个字符串的2,直接比较C是否和A一样,相比于BF判断时间会变短。

      后来我又找到了一个比较详细的图解

首先是初始化

之后我们只需要比较i指针指向的字符和j指针指向的字符是否一致。如果一致就都向后移动,如果不一致,如上图

 

 

之后将下一个字符串的j元素移至上一次比较出现不同的地方

二. 分享的资料

https://blog.csdn.net/starstar1992/article/details/54913261/

https://www.cnblogs.com/yjiyjige/p/3263858.html

三.目标

上周的目标实现了,主要就是练习了KMP算法的有关代码

下次的目标:继续多练习代码,减少每道题目花费的时间

posted on 2019-04-14 17:56  刘磊w  阅读(166)  评论(1编辑  收藏  举报