leetcode第28题,要求书写一个方法,传入串hayStack与needle,显示出needle在hayStack中的位置,其实是以前曾经了解过的KMP算法针对的模式串匹配问题。
由于写的过程中我没意识到这个问题,所以没有想到采用KMP,而是自己暴力匹配了一下,画了一个比较粗糙的流程图(其中str代表hayStack,key代表needle):
代码如下:
package pid28;
public class Solution {
public static int strStr(String haystack,String needle){
if(haystack.length()<needle.length()){
return -1;
}else{
if(needle.length() == 0){
return 0;
}else{
int i,j;
int index = -1;
char str[] = new char[haystack.length()];
char key[] = new char[needle.length()];
//将字符串存入数组
for(i=0;i<haystack.length();i++){
str[i] = haystack.charAt(i);
}
System.out.println();
//将字符串存入数组
for(j=0;j<needle.length();j++){
key[j] = needle.charAt(j);
}
System.out.println();
//算法主体
i=0;
j=0;
while(true){
if(str[i] == key[j]){//开始匹配串
if(j ==0){
index = i;
i++;
j++;
}else{
i++;
j++;
}
if(j==key.length){
return index;
}
}else{
if(j == 0){//匹配头字符而不得
i++;
}else{//*匹配了一般发现剩下的不对,i需要回退到index+1,否则i会跨过几个字符
i = index+1;
j = 0;
}
}
if(i == str.length){
return -1;
}
}
}
}
}
public static void main(String[] args) {
String haystack1 = "mississip";
String needle1 = "issip";
System.out.println(strStr(haystack1,needle1));
String haystack2 = "";
String needle2 = "";
System.out.println(strStr(haystack2,needle2));
String haystack3 = "aaa";
String needle3 = "aaaa";
System.out.println(strStr(haystack3,needle3));
String haystack4 = "";
String needle4 = "a";
System.out.println(strStr(haystack4,needle4));
}
}
果然,性能表现很垃圾:
收获:
总归是自己做了一次,面对接近10次的不通过,只能感慨自己想到的情况太少。
比较特殊的几个测试用例已经写在主方法中,对照着就能看明白过程中的有些分支语句是在做什么了。