第四章学习小结
一. 完成作业或实践时解决困难的经验分享
这一部分就主要说说作业一的思路吧
在一开始准备用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算法的有关代码
下次的目标:继续多练习代码,减少每道题目花费的时间