字符串匹配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 {
}
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(看毛片算法)——深入讲解next数组的求解
- 字符串匹配算法之KMP
- [时空权衡]字符串匹配算法 KMP
- 字符串匹配:看毛片算法及其它
- 字符串匹配算法-KMP整理(英文)
- 算法学习-KMP(字符串匹配)解释
- KMP字符串匹配算法
- 算法模板——KMP字符串匹配
- 字符串匹配高效算法 KMP-c++代码
- 字符串匹配算法:KMP
- 数据结构与算法之KMP 字符串匹配
- 字符串匹配算法:KMP学习心得
- 字符串匹配算法——BF、KMP、Sunday
- 字符串匹配算法KMP详解
- 浅谈字符串匹配的几种算法(KMP,Boyer-Moore)
- 字符串匹配算法_KMP
- 转载: 一篇关于字符串匹配的(KMP)算法_图文并茂
- Java实现 字符串匹配 KMP 算法
- 字符串匹配算法KMP详细解释——深入理解
- 字符串匹配的 KMP 算法