28. 找出字符串中第一个匹配项的下标
思路:
直接模拟也可以过,但是确实是带有很强烈的KMP的气息,考这题不能装作没听过KMP算法的样子,实战切忌一下子就写到没有优化空间的地步,那样他还会考一次......
class Solution {
public int strStr(String haystack, String needle) {
int n=haystack.length();
int m=needle.length();
char[] s=haystack.toCharArray();
char[] t=needle.toCharArray();
for(int i=0;i<n;i++){
int left=i;int right=0;
while(left<n && right<m){
if(s[left]==t[right]){
left++;
right++;
}else{
break;
}
if(right==m){
return left-m;
}
}
}
return -1;
}
}
使用KMP之后,时间复杂度从O(m*n)降低到 O(m+n)......
class Solution {
public void getNext(int[] next, String s){
int j = -1;
next[0] = j;
for (int i = 1; i < s.length(); i++){
while(j >= 0 && s.charAt(i) != s.charAt(j+1)){
j=next[j];
}
if(s.charAt(i) == s.charAt(j+1)){
j++;
}
next[i] = j;
}
}
public int strStr(String haystack, String needle) {
if(needle.length()==0){
return 0;
}
int[] next = new int[needle.length()];
getNext(next, needle);
int j = -1;
for(int i = 0; i < haystack.length(); i++){
while(j>=0 && haystack.charAt(i) != needle.charAt(j+1)){
j = next[j];
}
if(haystack.charAt(i) == needle.charAt(j+1)){
j++;
}
if(j == needle.length()-1){
return (i-needle.length()+1);
}
}
return -1;
}
}
459.重复的子字符串
我再看几遍答案...