Implement strStr().
Returns the index of the first occurrence of needle in haystack, or -1 if needle is not part of haystack.
Update (2014-11-02):
The signature of the function had been updated to return the index instead of the pointer. If you still see your function signature returns a char *
or String
, please click the reload button to reset your code definition.
Have you met this question in a real interview?
思路1 : 直接用暴力求解,找到字串的位置,
思路2 : 用 kmp 来解, 参考 我自己写的 KMP算法。
易错点: 1. 注意回溯到t 的头时候, j = -1, 这个时候 i 和 j 都要 ++ , 从头开始嘛。
2. 注意生成 next 数组的时候, 第一位要 -1, 最后一位不用比较。
public class Solution {
public int strStr(String haystack, String needle) {
int n = haystack.length();
int m = needle.length();
if (n < m)
return -1;
if (m == 0)
return 0;
if (n == 0)
return -1;
return KMP(haystack, needle);
}
public int KMP(String s, String t){
int[] next = new int[t.length()];
nextGenerate(t, next);
int i = 0;
int j = 0;
while(i < s.length()){
if(j == -1 || s.charAt(i) == t.charAt(j)){//-------
i++;
j++;
}else{
j = next[j];
}
if(j == t.length())
return i - j;
}
return -1;
}
private void nextGenerate(String t, int[] next){
next[0] = -1;
for(int i = 1; i < t.length() - 1; i++){//-------
if(t.charAt(i) == t.charAt(next[i]))
next[i + 1] = next[i] + 1;
else
next[i + 1] = 0;
}
}
}