字符串匹配KMP算法

`该实现的内功心法来自于以下链接:
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;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值