Implement strStr().
Returns the index of the first occurrence of needle in haystack, or -1 if needle is not part of haystack.
解法一:(暴力法)
public class Solution {
public static int strStr(String haystack, String needle) {
int m = haystack.length();
int n = needle.length();
if(m==0&&n==0) return 0;
else if(m==0&&n!=0) return -1;
else if(m!=0&&n==0) return 0;
for(int i = 0; i <= m-n; i ++)
{
int j;
for(j = 0; j < n; j ++)
{
if(haystack.charAt(i+j) == needle.charAt(j)){
if(j == n-1)
return i;
}
else break;
}
}
return -1;
}
}
解法二:(KMP算法)
public class Solution {
static int strStr(String haystack, String needle) {
int hlen = haystack.length();
int nlen = needle.length();
if(hlen==0&&nlen==0) return 0;
else if(hlen==0&&nlen!=0) return -1;
else if(hlen!=0&&nlen==0) return 0;
int[] next = new int[nlen];
getNext(needle, next);
int i = 0;
int j = 0;
while (i < hlen && j < nlen) {
if (j == -1 || haystack.charAt(i) == needle.charAt(j)) {// match current position, go next
i++;
j++;
} else {// jump to the previous position to try matching
j = next[j];
}
}
if (j == nlen)
// all match
return i - nlen;
else
return -1;
}
private static void getNext(String needle, int next[]) {// self match to contruct next array
int nlen = needle.length();
int j = -1; // slow pointer
int i = 0; // fast pointer
next[i] = -1; //init next has one element
while (i < nlen - 1) {
if (j == -1 || needle.charAt(i) == needle.charAt(j)) {
j++;
i++; //thus the condition (i < nlen-1)
next[i] = j; //if position i not match, jump to position j
} else {
j = next[j]; //jump to the previous position to try matching
}
}
}
}