模式串匹配的暴力算法

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次的不通过,只能感慨自己想到的情况太少。
比较特殊的几个测试用例已经写在主方法中,对照着就能看明白过程中的有些分支语句是在做什么了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值