您的位置:首页 > 其它

字符串匹配KMP(看毛片)算法

2017-06-11 22:16 253 查看
该实现的内功心法来自于以下链接:

https://mp.weixin.qq.com/s/m2cgiVCoh5hwvgPSwKJHpQ

github:https://github.com/renxue/algorithm-for-java/blob/master/src/com/fengchengpeng/find/KMP.java

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;
}


}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  kmp 算法