Implement strStr().
Returns the index of the first occurrence of needle in haystack, or -1 if needle is not part of haystack.
一刷没ac
解题思路:kmp
public class Solution {
public int strStr(String haystack, String needle) {
if(needle.length() == 0) return 0;
if(haystack == null || haystack.length() == 0 || haystack.length() < needle.length()) return -1;
for(int i = 0; i <= haystack.length(); i++){
for(int j = 0; j <= needle.length(); j++){
if(j == needle.length()) return i;
if(i+j == haystack.length()) return -1;
if(haystack.charAt(i+j) != needle.charAt(j)) break;
}
}
return -1;
}
}
public class Solution {
public int strStr(String haystack, String needle) {
if(needle.length() == 0) return 0;
if(haystack == null || haystack.length() == 0 || haystack.length() < needle.length()) return -1;
char[] text = haystack.toCharArray();
char[] pattern = needle.toCharArray();
return kmp(text, pattern);
}
public int kmp(char[] text, char[] pattern){
int[] nextarray = nextarray(pattern);
int i = 0, j = 0;
while(i < text.length && j < pattern.length){
if(text[i] == pattern[j]){
i++;
j++;
}else{
if(j != 0){
j = nextarray[j-1];
}else i++;
}
}
if(j == pattern.length) return i-j;
return -1;
}
public int[] nextarray(char[] pattern){
int[] lps = new int[pattern.length];
int index = 0;
for(int i = 1; i < pattern.length;){
if(pattern[i] == pattern[index]){
lps[i] = index+1;
index++;
i++;
}else{
if(index == 0){
lps[i] = 0;
i++;
}else index = lps[index-1];
}
}
return lps;
}
}