我写的垃圾暴力,太垃圾了,这个脑子。
class Solution {
public int strStr(String haystack, String needle) {
if(needle==null||needle.length()==0)return 0;
if(needle.length()>haystack.length()) return -1;
for(int i=0;i<haystack.length();i++){
int flag=1;
for(int k=i;k<haystack.length();k++){
int j=0;
while(j<needle.length()&&k<haystack.length()){
if(needle.charAt(j)!=haystack.charAt(k)){
flag=0;break;
}
else{
k++;
j++;
}
}
if(flag==0)break;
if(j==needle.length())return i;
}
}
return -1;
}
}
Solution 1: 优雅一点的暴力 O(m*n)
class Solution {
public int strStr(String haystack, String needle) {
if(needle==null||needle.length()==0)return 0;
if(needle.length()>haystack.length()) return -1;
int j=0;
for(int i=0;i<haystack.length()-needle.length()+1;i++){
for(j=0;j<needle.length();j++){
if(haystack.charAt(i+j)!=needle.charAt(j)){
break;
}
}
if(j==needle.length())return i;
}
return -1;
}
}
Solution 2: 模式匹配 O(m*n)
class Solution {
public int strStr(String haystack, String needle) {
int m=haystack.length();
int n=needle.length();
int i=0,j=0;
while(i<m&&j<n){
if(haystack.charAt(i)==needle.charAt(j)){
j++;
i++;
}
else{
i=i-j+1;
j=0;
}
}
if(j==n) return i-n;
return -1;
}
}
Solution 3: KMP 复杂度为O(m+n)
next数组的理解:
https://blog.csdn.net/wenyun_kang/article/details/65436838?locationNum=13&fps=1
我为了数组从0开始匹配,将next[0]定为-1
class Solution {
public int strStr(String haystack, String needle) {
if(needle==null||needle.length()==0)return 0;
int m=haystack.length();
int n=needle.length();
int i=0,j=0;
int[] next=getNext(needle);
while(i<m&&j<n){
if(j==-1||haystack.charAt(i)==needle.charAt(j)){
j++;
i++;
}
else{
j=next[j];
}
}
if(j==n) return i-n;
return -1;
}
private int[] getNext(String needle){
int [] next=new int[needle.length()];
int i=0;
next[0]=-1;
int j=-1;
while(i<needle.length()){
if(j==-1||needle.charAt(i)==needle.charAt(j)){
i++;
j++;
if(i<needle.length())
next[i]=j;
}
else{
j=next[j];
}
}
return next;
}
}