有一个字符串s1,和一个子串s2,找出s2在s1中的位置
存在则返回s2第一个字符所在的索引下标,无则返回-1
代码如下:
暴力匹配
/**
* 暴力匹配算法
* @param s1
* @param s2
* @return
*/
public static int getStrIndex(String s1, String s2){
int i = 0;
int j = 0;
char[] c1 = s1.toCharArray();
char[] c2 = s2.toCharArray();
while(i < c1.length && j < c2.length){
if(c1[i] == c2[j]){
//字符匹配,继续下一个字符
i++;
j++;
}else {
//字符不匹配,s1回到原来位置后一位,s2索引重置
i = i - j + 1;
j = 0;
}
}
return j == c2.length ? i - j : -1;
}
KMP算法
/**
* KMP算法,匹配字符串
* @param s1
* @param s2
* @return
*/
public static int getStrIndex(String s1, String s2){
char[] c1 = s1.toCharArray();
char[] c2 = s2.toCharArray();
int i = 0;
int j = 0;
int[] nextArr = getNextArr(c2);
while(i < c1.length && j < c2.length){
if(j == -1 || c1[i] == c2[j]){
i++;
j++;
}else {
j = nextArr[j];
}
}
return j == c2.length ? i - j : -1;
}
/**
* KMP获取next数组
* @return
*/
private static int[] getNextArr(char[] arr) {
int[] nextArr = new int[arr.length];
nextArr[0] = -1;
int k = -1;
int j = 0;
while(j < arr.length - 1){
if(k == -1 || arr[j] == arr[k]){
j++;
k++;
nextArr[j] = arr[j] != arr[k] ? k : nextArr[k];
}else {
k = nextArr[k];
}
}
return nextArr;
}