一、朴素算法
朴素算法就是最简单的暴力匹配算法,其步骤如下:
- 用两个指针 i,j 分别指向主串和模式串的第一个字符。
- 如果当前主串和模式串的字符相等,则两个指针后移,i ++,j ++。
- 如果当前主串和模式串的字符不相等,则 i 回到这一轮开始比较的字符的下一个字符 i - j + 1;j 则归零 j = 0,指向模式串的第一个字符。
- 如果最终 j 等于模式串的长度,则返回主串第一次出现模式串的位置 i - j,否则返回 -1。
假设主串的长度为 m,模式串的长度为 n,则该算法的时间复杂度是 O(mn)。
public static int violentSearch(String text,String pattern) {
int i=0,j=0;
while(i<text.length() && j<pattern.length()) {
if(text.charAt(i)==pattern.charAt(j)) {
i++;
j++; //两个字符串暂时相等,两个索引加一继续比较
}else {
i=i-j+1; //不能直接加一
j=0; //两个字符串出现不相等的字符,模式串索引归零,主串索引指向原地方下一个字符
}
}
if(j==pattern.length()) {
return i-j; //主串与模式串相等,返回B串第一次在A串出现的地方
}
return -1;
}
二、KMP算法
首先,用下面这个例子演示一下KMP算法是怎么工作的,如果看不懂可以先往下看。
在这里先解释一下什么是字符串的前缀和后缀。
存在字符串A和B,如果A=BS,其中S是任