解决问题
str1中是否有某个子串等于str2,有则返回在str1中得到起始位置。
举例:abcabck 和 abcabct 此时返回-1
abcabcabct 和 abcabct 此时返回3
常规思路
用str2去比较str1从0开始的每一位,比较结束若有str2返回此时比较的起始位置,否则返回-1
KMP算法思路
先计算出str2的nexts数组(起始位-1,计算出其他位置最长前缀和最长后缀到的匹配【要求前缀不包含最后一位,后缀不包含起始位】)
举例:str2–“ababat” 则对应得到nexts={-1,0,0,1,2,3}
nexts计算:
当前位置为i, 比较后缀开始位置pos - 1和前缀开始位置cn,相等时较前缀计数+1;
不等时,前缀位置往前跳到cn = next[cn];(cn > 0)
否则,当前位置为0
然后str1和str2进行比较:
index1指示str1当前位置,index2指示str2当前位置
1.str1开头不等于str2起始位置,str1当前位置index1后移一位
2.相等时index1++,index2++
3.经历2后不等,则从str2的nexts[index2]与str1的index1开始比较,前面部分肯定相等无需再比较
4.比较完后返回index1 - index2
代码见
https://github.com/liuzhuguan/Algorithm2/tree/master/算法进阶/进阶1/src