Return the index of the first occurrence of needle in haystack, or -1 if needle is not part of haystack.
Example 1:
Input: haystack = "hello", needle = "ll" Output: 2
Example 2:
Input: haystack = "aaaaa", needle = "bba" Output: -1
方法一:两层遍历
class Solution {
public int strStr(String haystack, String needle) {
int hlength = haystack.length();
int nlength = needle.length();
if(hlength == 0){
if(nlength == 0){
return 0;
}else{
return -1;
}
}
if(nlength == 0){
return 0;
}
for(int i = 0; i < hlength; i++){
for(int j = 0; j < nlength; j++){
int a = i;
int b = j;
while(a < hlength && b < nlength && haystack.charAt(a) == needle.charAt(b)){
a++;
b++;
}
if(b == nlength){
return a-b;
}
break;
}
}
return -1;
}
}
方法二:KMP
class Solution {
public static int[] getNext(String needle){
int length = needle.length();
int[] result = new int[length+1];
result[0] = -1;
int i = 0, j = -1;
while (i < length){
if (j == -1 || needle.charAt(i) == needle.charAt(j)){
++i;
++j;
result[i] = j;
}else{
j = result[j];
}
}
return result;
}
public int strStr(String haystack, String needle) {
int hlength = haystack.length();
int nlength = needle.length();
if(hlength == 0){
if(nlength == 0){
return 0;
}else{
return -1;
}
}
int[] next = getNext(needle);
int i = 0;
int j = 0;
while(i < hlength && j < nlength){
if(j == -1 || haystack.charAt(i) == needle.charAt(j)){
i++;
j++;
}else{
j = next[j];
}
}
if(j == nlength){
return i-j;
}else{
return -1;
}
}
}