【题目】
字符串str1和str2,str1是否包含str2,如果包含,返回str2在str1中的开始位置
【要求】时间复杂度为O(N)
public class KMP {
private static int getIndexOf(String str1, String str2){
char[] arr1 = str1.toCharArray();
char[] arr2 = str2.toCharArray();
int[] next = getNextArray(arr2);
int i1= 0;
int i2 = 0;
while (i1<arr1.length && i2<arr2.length){
if (arr1[i1] == arr2[i2]){
i1++;
i2++;
} else if (next[i2] == -1){
i1++;
} else{
i2 = next[i2];
}
}
return arr2.length == i2 ? i1-i2 : -1;
}
private static int[] getNextArray(char[] arr){
int[] next = new int[arr.length];
next[0] = -1;
next[1] = 0;
int i = 2;
int cn = 0;
while(i < arr.length){
if (arr[i-1] == arr[cn]){
next[i++] = ++cn;
} else if(cn > 0){
cn = next[cn];
} else {
next[i++] = 0;
}
}
return next;
}
public static void main(String[] args) {
String str = "abcabcababaccc";
String match = "ababa";
System.out.println(getIndexOf(str, match));
}
}
对于英文或者是数字字符串比较适合,只有有限个字符,对于str1较长,str2重复度较高的情况下,该算法速度很快,省去很多重复的对比。就是平移对比位置,对已经确定的重复字符串不作重复对比