暴力算法和KMP算法解决经典字符串匹配问题

暴力算法和KMP算法解决经典字符串匹配问题

1、暴力匹配算法解决字符串匹配问题

public class baoli {

	public static void main(String[] args) {
		 //测试
		String str1="我爱你你爱我大家都爱我";
		String str2="你爱我";
		int index=violenceMatch(str1,str2);
		System.out.println("index = "+index);
	}
	//暴力匹配算法实现
	public static int violenceMatch(String str1,String str2) {
		char[] s1=str1.toCharArray();
		char[] s2=str2.toCharArray();
		int s1len=s1.length;
		int s2len=s2.length;
		int i=0;  //i指向索引s1
		int j=0;  //j索引指向s2
		while(i<s1len&&j<s2len) {	 //保证匹配对,不越界
			if(s1[i]==s2[j]) {
				i++;
				j++;
			}else {  //匹配不成功
				i=i-(j-1);
				j=0;
			}
		}
		//判断是否匹配成功
		if(j==s2len) {
			return i-j;
		}else {
			return -1;
		}
	}
}

运行结果:
在这里插入图片描述
注意:下标从0开始计算!

2、KMP算法解决字符串匹配问题

public class Kmp {
	public static void main(String[] args) {
		String str1="BBC ABCDAB ABCDABCDABDE";
		String str2="ABCDABD";
		int[] next=kmpNext("ABCDABD"); //[0,1,2]
		System.out.println("next = "+Arrays.toString(next));
		int index=kmpSearch(str1,str2,next);
		System.out.println("index = "+index);
	}
	public static int kmpSearch(String str1,String str2,int[] next) {
		//遍历
		for(int i=0,j=0;i<str1.length();i++) {
			//需要处理str1.charAt(i)!=str2.charAt(j)
			//KMP算法的核心
			while(j>0&&str1.charAt(i)!=str2.charAt(j)) {
				j=next[j-1];
			}
			if(str1.charAt(i)==str2.charAt(j)) {
				j++;
			}
			if(j==str2.length()) {  //找到了
				return i-j+1;
			}
		}
		return -1;
	}
	
	//获取一个字符串(子串)的部分匹配值表
	public static int[] kmpNext(String dest) {
		//创建一个next数组保存部分匹配值
		int[] next=new int[dest.length()];
		next[0]=0;  //如果字符串是长度为1部分匹配值为0
		for(int i=1,j=0;i<dest.length();i++) {
			//重新获取j
			//kmp算法的核心
			while(j>0&&dest.charAt(i)!=dest.charAt(j)) {
				j=next[j-1];
			}
			//当dest.charAt(i)==dest.charAt(j)满足时,部分匹配值就是+1
			if(dest.charAt(i)==dest.charAt(j)) {
				j++;
			}
			next[i]=j;
		}
		return next;
	}
}

运行结果:
在这里插入图片描述
注意:下标也是从0开始计算的!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值