KMP是字符串模式匹配算法,用来求解模式串在主串中第一次出现的位置
简单模式匹配算法,其主串指针会回溯,时间复杂度为O(mn)
//简单模式匹配算法
public int getIndex(String s, String t) {
for (int i = 0; i <= s.length() - t.length(); i++) {
int k = i;
int j = 0;
while (j < t.length()) {
if (s.charAt(k) == t.charAt(j)) {
k++;
j++;
} else {
break;
}
}
if (j == t.length()) return i;
}
return -1;
}
而KMP算法,主串指针不用回溯,时间复杂度为O(m+n)
//KMP算法
//求模式串每个字符所在位置与模式串自身的最长公共子前缀的开始位置,意义是当匹配到此字符出现问题时,不从头开始,而是从其最长公共子前缀的开始位置开始新一轮匹配,且主串指针不回溯
public int[] getNext(String t) {
int[] next = new int[t.length()];
next[0] = -1;
next[1] = 0;
for (int i = 2; i < t.length(); i++) {
int k = i - 1;
while (next[k] >= 0 && t.charAt(next[k]) != t.charAt(i - 1)) {
k = next[k];
}
if (next[k] < 0) next[i] = 0;
else next[i] = next[k] + 1;
}
return next;
}
//KMP算法
public int kmp(String s, String t) {
int[] next = getNext(t);
int i = 0;
while (i < s.length() - t.length()) {
int k = 0;
while(k >= 0){
while (s.charAt(i) == t.charAt(k)) {
i++;
k++;
if(k == t.length()) return i - t.length();
}
k = next[k];
}
i++;
}
return -1;
}