字符串匹配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;}

}