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")); } }