28. 实现strStr()
题目链接
双指针
class Solution {
public int strStr(String haystack, String needle) {
if(needle.length() == 0) return 0;
int len1 = haystack.length();
int len2 = needle.length();
for(int i = 0; i < len1 - len2 + 1; i++){
boolean flag = true;
for(int j = 0; j < len2; j++)
if(haystack.charAt(i+j) != needle.charAt(j)){
flag = false;
break;
}
if(flag) return i;
}
return -1;
}
}
- 另有将字符串中字母转为数字,在常数时间内求得子串哈希值,进行比较的方法,但局限较大,字符串中的字符必须为小写字母
KMP算法
class Solution {
public int strStr(String haystack, String needle) {
if(needle.length() == 0) return 0;
String pat = needle;
int M = pat.length();
int R = 26;
int[][] dfa = new int[R][M];
dfa[pat.charAt(0) - 'a'][0] = 1;
for(int X = 0, j = 1; j < M; j++){
for(int c = 0; c < R; c++)
dfa[c][j] = dfa[c][X];
dfa[pat.charAt(j) - 'a'][j] = j+1;
X = dfa[pat.charAt(j) - 'a'][X];
}
String txt = haystack;
int i, j, N = txt.length();
for(i = 0, j = 0; i < N && j < M; i++)
j = dfa[txt.charAt(i) - 'a'][j];
if(j == M) return i-M;
else return -1;
}
}
- 可能是题目中的N相对较小,MR相对较大,用时反而更久