`该实现的内功心法来自于以下链接:
https://mp.weixin.qq.com/s/m2cgiVCoh5hwvgPSwKJHpQ
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Created by fengchengpeng on 2017/4/8.
*/
public class KMP {
public static void main(String[] args) {
String src = "BBCABCDABABCDABCDABDE";
String findSrc = "ABCDABD";
//String src = "ABCDHABCDYABDDYhkABC";
//String findSrc = "ABD";
Map<String, Integer> partialMatchTable = partialMatchTable(findSrc);
findMatchString(src, findSrc, partialMatchTable);
}
public static void findMatchString(String src, String findSrc, Map<String, Integer> partialMatchTable) {
int count = 0;
int index = 0;
int start = 0;
int appearTime = 0;
int end = 0;
while (index < src.length()) {
if ( count < findSrc.length() && src.charAt(index) == findSrc.charAt(count) ) {
count++;
index++;
continue;
}
if (count == findSrc.length()) {
//Calculation the index of characters that need to be matched in the original string appears
start = (index-count);
end = index;
System.out.println(src.substring(start, end));
count = 0;
appearTime++;
continue;
}
if (count < findSrc.length() && count > 0){
String mathced = findSrc.substring(0, count);
int partialMatchValue = partialMatchTable.get(mathced);
index = (index-count) + (mathced.length() - partialMatchValue);
count = 0;
} else {
index++;
}
}
System.out.println("string appear times : " + appearTime);
}
public static Map<String, Integer> partialMatchTable(String str) {
List<String> prefix = new ArrayList<>();
List<String> suffix = new ArrayList<>();
Map<String, Integer> map = new HashMap<>();
for (int i = 0; i < str.length(); i++) {
//Generates a prefix list for this loop
int n = 0;
while (n < i) {
prefix.add(str.substring(0, n + 1));
n++;
}
//Generates a suffix list for this loop
n = 1;
while (n <= i) {
suffix.add(str.substring(n, i + 1));
n++;
}
//Find the partial match value for the loop generated string
map.put(str.substring(0, i+1), 0);
for (String value : prefix) {
if (suffix.contains(value)) {
map.put(str.substring(0, i+1), value.length());
}
}
//After each cycle to clear the list, to avoid affecting the next calculation
prefix.clear();
suffix.clear();
}
return map;
}
}