一、暴力匹配
public static int worstMatch(String s, String p)
{
int sLen = s.length();
int pLen = p.length();
int i = 0;
int j = 0;
while (i < sLen && j < pLen)
{
if (s.charAt(i) == p.charAt(j))
{
//如果当前字符匹配成功(即S[i] == P[j]),则i++,j++
i++;
j++;
}
else
{
//如果失配(即S[i]! = P[j]),s回退j步到匹配开始的位置,
//然后从下一位置重新开始,即i = i - j+1
i = i - j + 1;
j = 0;
}
}
//匹配成功,返回模式串p在文本串s中的位置,否则返回-1
if (j == pLen) return i - j;
return -1;
}
二、KMP算法
对于KMP算法,这篇博客讲解得非常透彻。KMP算法详解
1、KMP思想
总的思想:记录模式串中最长重复子串,只移动模式串,当发现不匹配字符时,模式串的指针尽可能少的回退到下一个可能匹配的位置。
例如匹配串s是ABCDEABCDEABCDFABCDE,模式串p是ABCDEABCDF,那么模式串p中F之前实际上有最长重复子串ABCD,所以当指针i移到s[9],指针j移到p[9]时,发现字符E和字符F不相等,则i不变j回退到4,下次匹配时直接比较s[9]和p[4]即可,而无须i回到1,j回到0。即当s[i]和s[j]不匹配时,j=next[9]=4。
那么如何得到next数组呢,假设已知next[i]=k,则p[0]、p[1]、p[2]、…、P[k-1]这前k个字符与p[i-k]、p[i-k+1]、p[i-k+2]、~、p[i-1]这后k个字符相同,那么计算next[i+1]时,我们只需要判断p[i]和p[k]两个字符就有可能确定next[i+1