字符串匹配KMP(看毛片)算法
来源:互联网 发布:myeclipse连接数据库 编辑:程序博客网 时间:2024/04/25 23:35
该实现的内功心法来自于以下链接:
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;}
}
阅读全文
0 0
- 字符串匹配KMP(看毛片)算法
- 字符串匹配之看毛片算法-KMP
- KMP-看毛片算法
- 【字符串匹配】——KMP(看毛片算法)——深入讲解next数组的求解
- 看毛片(KMP)算法简析
- kmp(看毛片)算法详解
- KMP-看毛片算法 c++
- 初次接触kmp看毛片算法
- kmp“看毛片”算法模板题
- KMP(看毛片)-
- KMP (看毛片算法) 养成篇 (一)(启发篇)
- 菜鸟都能理解的看毛片(KMP)算法
- poj 3461 (看毛片算法初探)
- 字符串匹配(KMP算法)
- 字符串匹配算法(KMP)
- kmp算法(字符串匹配)
- 字符串匹配(KMP算法)
- KMP算法(字符串匹配)
- 读取本地文件assets内容
- [leetCode刷题笔记]520. Detect Capital
- java Socket编程
- fedora26 安装 jekyll 报错
- tophat常见错误
- 字符串匹配KMP(看毛片)算法
- linux如何查看端口被哪个进程占用的方法
- Java三大主流框架概述
- ToString("X2")的含义及使用
- oracle约束+check+暴力删除表,无视外键+查看用户创建的表+查看约束
- 21天web错误统计
- RMQ( 区间最值,区间频繁次数)
- 3. Longest Substring Without Repeating Characters题解
- curry