今天做了LeetCode_28,题目如下图所示。
首先我想到的是朴素算法,将needle串的每个字母与haystack串去进行逐一比较,代码如下。
public int strStr(String haystack, String needle) {
int len_hay = haystack.length();
int len_need = needle.length();
if(len_need==0){
return 0;
}
if(len_hay == 0){
return -1;
}
int ans = 0;
char[] hay = haystack.toCharArray();
char[] need = needle.toCharArray();
for(int i=0;i<len_hay-len_need+1;i++){ //如果i>=len_hay-len_need+1,那么hay串剩下的长度小于need串的长度,就不可能还有need串了
if(hay[i]==need[0]){
int temp1 = i;
int temp2 = 0;
while(hay[temp1++]==need[temp2++]){
if(temp2==len_need)return i;
}
}
}
return -1;
}
值得一提的是虽然是朴素算法但我用到了剪枝的思想,将时间复杂度稍稍下降到O((m-n)*n)
看了答案后发现有个叫KMP算法的专门是计算a串是否包含b串,并返回起始下标。
接下来讲讲KMP算法。
先来举个例子:串s1为aabaacab,s2为aabaab