要搞懂KMP算法首先要明白这个算法是用来做什么的。
需求
无耻的熟人xx:“欸~小上官,原来你(也)是个程序员,那帮我想想看……”
你:S.x.x.T,我连自己的内心活动都自带哔哔声和谐了,你还要我搞什么!
伟大的朋友xx:“……怎么从一串字符串里面搜索出想要的子串。搞得好的话……”,说着就掏出了手机打开了苇名城的信,“把她/他介绍给你。”
你:“我不是那种人。”
高尚的好友xx:“加上这个。”
你:“这不太好。”
高尚无私且伟大的同志xx:“再加上这个。”
你:
“私聊。”
果然无人能抵抗苇名城的魅力。
回到正题,KMP算法可以用在查找字符串中的子串,即匹配字符串。什么是字串?例如“believe”中就有“lie”、“bitch”里面有“bit”,“lie”、“bit”就是子串,“believe”、“bitch”就是主串。我们定义子串在主串中的位置就是子串的第一个字符在主串中的序号。不过老婆/公饼里面真的没老婆/公。
在真的开始讲KMP之前我们先看下暴力解法。
暴力解法
class Solution {
public:
int strStr(string haystack, string needle) {
if(needle.empty())
return 0;
int i=0,j=0;
while(haystack[i]!='\0'&&needle[j]!='\0')
{
if(haystack[i]==needle[j])
{
i++;
j++;
}
else
{
i=i-j+1;
j=0;
}
}
if(needle[j]=='\0')
return i-j;
return -1;
}
};
上面这部分代码的作者是2227。haystack是主串,needle是子串,
其实这个算法叫BF算法(Brute Force)。原理很简单,就是每次子串和主串发现不匹配,那么将子串往前移一格,直到匹配或者移出边