KMP算法

题目:

两行字符串,求第一行字符串在第二行中出现的次数。

 

删除之前的写法,之前对KMP算法不太了解,现在终于理解,并且实现了一发,具体参考为https://www.zhihu.com/question/21923021

import java.util.ArrayList;
import java.util.List;

public class KMP {
    public int[] calcu_max_match_lengths(String pattern){
        int length = pattern.length();
        int [] maxLengthArray = new int[length];
        int max_length =0;
        for(int i=1;i<length;i++){
            while(max_length > 0 && pattern.charAt(i)!= pattern.charAt(max_length)){
                max_length = maxLengthArray[i-1];
            }
            if(pattern.charAt(max_length) == pattern.charAt(i)){
                max_length++;
            }
            maxLengthArray[i]=max_length;
        }
        return maxLengthArray;
    }

    public List<Integer> find_match_Index(String text, String pattern){
        List<Integer>positions = new ArrayList<Integer>();
        int [] maxLengthArray = calcu_max_match_lengths(pattern);
        int count = 0;
        for(int i=0;i<text.length();i++){
            while(count > 0 && text.charAt(i) != pattern.charAt(count)){
                count = maxLengthArray[count-1];
            }
            if(text.charAt(i) == pattern.charAt(count)){
                count ++;
            }
            if(count == pattern.length()){
                positions.add(i-pattern.length()+1);
                count = maxLengthArray[pattern.length()-1];
            }
        }
        return positions;
    }

    public static void main(String [] args){
        System.out.println(new KMP().find_match_Index("abcdeabc","abc"));
    }
}

 

posted @ 2016-05-18 09:41  bounce  阅读(215)  评论(0编辑  收藏  举报