什么是KMP算法?解决字符串匹配的效率问题。
https://www.youtube.com/watch?v=GTJr8OvyEVQ
public class SubstringSearch {
//重点在这个方法这里,每次pattern匹配到第j个字符的时候发现无法匹配,不会直接跳转到index = 0的字符,而是和它有相同前缀的字符那边,具体可以看上面视频,这个讲的不错。思考一下传统的字符串匹配算法如何实现?O(m*n),如何改进?是否有重复问题,
private int[] computeTemporaryArray(char pattern[]) {
int[] lps = new int[pattern.length];
int j = 0;
int i = 1;
while (i < pattern.length) {
if(pattern[i] == pattern[j]) {
lps[i] = j + 1;
i++;
j++;
}
else {
if( j != 0) {
j = lps[j - 1];
}
else {
lps[i] = 0;
i++;
}
}
}
return lps;
}
public boolean KMP(char[] text, char[] pattern) {
int[] lps = computeTemporaryArray(pattern);
int i = 0;
int j = 0;
while (i < text.length && j < pattern.length) {
if(text[i] == pattern[j]) {
i++;
j++;
}
else {
if(j != 0) {
j = lps[j-1];
}
else {
i++;
}
}
}
if(j == pattern.length)
return true;
return false;
}
public static void main(String[] args) {
String str = "abcxabcdabcdabcy";
String subString = "abcdabcy";
SubstringSearch ss = new SubstringSearch();
boolean result = ss.KMP(str.toCharArray(), subString.toCharArray());
System.out.print(result);
}
}