先来个题,这块我不确定下次看会不会蒙,但是我也确实用语言表达不出来
Leetcode 28
暴力法:
class Solution {
public int strStr(String s1, String s2) {
char[] arr1=s1.toCharArray();
char[] arr2=s2.toCharArray();
if(arr2.length==0){
return 0;
}
int cn=0;
for(int i=0;i<arr1.length;i++){
int k=i;
for(int j=0;j<arr2.length&&k<arr1.length;j++){
if(arr1[k++]==arr2[j]){
cn++;
}
}
if(cn==arr2.length){
return i;
}
cn=0;
}
return -1;
}
}
kmp解法
class Solution {
public int strStr(String s1, String s2) {
char[] arr1=s1.toCharArray();
char[] arr2=s2.toCharArray();
if(arr2.length==0){
return 0;
}
int[] next=getnext(arr2);
int i1=0;
int i2=0;
while(i1<arr1.length&&i2<arr2.length){
if(arr1[i1]==arr2[i2]){
i1++;
i2++;
}else if(next[i2]==-1){
i1++;
}else{
i2=next[i2];
}
}
return i2==arr2.length?i1-i2:-1;
}
public int[] getnext(char[] arr2){
if(arr2.length==1){
return new int[]{1};
}
int[] next=new int[arr2.length];
next[0]=-1;
next[1]=0;
int k=2;
int cn=0;
while(k<arr2.length){
if(arr2[cn]==arr2[k-1]){
next[k++]=++cn;
}else if(cn>0){
cn=next[cn];
}else{
next[k++]=0;
}
}
return next;
}
}