1. 前言
KMP算法用于解决字符串匹配问题,现有两个字符串 S 和 P,请求出字符串 P 在字符串 S 中首次出现的位置,通常 S 被称为文本串,P 被称为模式串. 我们规定字符串的下标从 0 开始,文本串 S 的长度为 n n n,模式串 P 的长度为 m m m. 在下面这个例子中,模式串 P 在 S 中首次出现的位置是 4.

2. 暴力匹配
解决这个问题最直接的方法就是用模式串 P 的开头依次与文本串 S 中的每一个下标对齐,然后判断 S 和 P 的后续字符是否完全相等. 在最差的情况下,算法的复杂度是 O ( n m ) O(nm) O(nm).
暴力匹配的代码如下,我们根据代码来观察具体的匹配过程.
int match(string s,string p){
int n=s.length();
int m=p.length();
int i=0,j=0;
while(i<n && j<m){
if(s[i]==p[j]) { ++i;++j; }
else { i=i-j+1;j=0; }//当前字符不匹配就把p向右平移1位
}
return j<m?-1:i-j;//匹配失败返回-1