题目:
给定一个字符串s和一个模式串p, 返回s中所有与p匹配的字符串开始下标
分析:
KMP算法, 解释看这里
package hello;
import java.util.ArrayList;
import java.util.List;
public class KMP {
public static List<Integer> kmp(String s, String p){
List<Integer> res = new ArrayList<Integer>();
if(s == null || p == null || s.length()<p.length())
return res;
char[] sArr = s.toCharArray();
char[] pArr = p.toCharArray();
int[] next = getNext(p);
int i=0, j=0;
while(i<sArr.length){
while(j<pArr.length){
//加判断防止i溢出
if(i>=sArr.length)
break;
//j为-1或匹配,则两数组往后遍历
if(j==-1 || sArr[i]==pArr[j]){
i++;
j++;
}else{
//匹配失败,在next数组中找到应该移动到的位置
j = next[j];
}