暴力匹配
从主串的第一个位置起和模式串的第一个字符开始比较,如果相等,则继续逐一比较后 续字符;否则从主串的第二个字符开始,再重新用上一步的方法与模式串做比较,以此类推, 直到比较完模式串中的所有字符。
假设现在我们面临这样一个问题:有一个文本串S,和一个模式串P,现在要查找P在S中的位置,怎么查找呢?
如果用暴力匹配的思路,并假设现在文本串S匹配到 i 位置,模式串P匹配到 j 位置,则有:
- 如果当前字符匹配成功(即S[i] == P[j]),则i++,j++,继续匹配下一个字符;
- 如果失配(即S[i]! = P[j]),令i = i - (j - 1),j = 0。相当于每次匹配失败时,i 回溯,j 被置为0。
理清楚了暴力匹配算法的流程及内在的逻辑,咱们可以写出暴力匹配的代码,如下:
package 暴力匹配;
public class BaoLiMatches {
public static void main (String[] args) {
String str1 = "abcdefghigkm";
String str2 = "gkm";
int num = matches(str1, str2);
System.out.println(num);//输出9为正确;
}
public static int matches (String str1, String str2) {
char[] s1 = str1.toCharArray();
char[] s2 = str2.toCharArray();
int len1= s1.length;
int len2= s2.length;
int i=0;//str1索引
int j=0;//str2索引
while (i < len1 && j < len2) {
if (s1[i] == s2[j]) {
i++;
j++;
}else{
i=i-j+1;
j=0;
}
}
if (j==len2){
return i-j;
}else {
return -1;
}
}
}
用暴力匹配解决的话会有大量的回溯,每次只移动一位,若是不匹配,移动到下一位接着匹配,浪费了大量的时间。
KMP算法
对于上述的过程,部分匹配表是至关重要的,那么,这张表是如何产生的呢?
代码如下:
首先获取部分匹配表
然后就是KMP代码