Java数据结构与算法基础必备--暴力算法

本文介绍了如何使用暴力算法解决字符串匹配问题,将字符串转换为字符数组进行逐个字符比对。文章强调了暴力算法的资源消耗问题,并提到了优化方法——限制不必要的条件或采用更高效的KMP算法。作者提醒暴力算法虽有局限性,但也可在思维启发中发挥作用。
摘要由CSDN通过智能技术生成

暴力算法

题目:

字符串匹配问题:
1)有一个字符串 str1 = "Hello World,Hellowwhelloworld",和一个子串str2 = "world"
2)现在要判断 str1是否含有 str2,如果存在,就返回第一次出现的位置,如果没有,则返回-1

分析思路(先理一下):

1)首先,暴力破解法,就是把所有条件、所有情况统统考虑进去,让计算机进行检索,直到得出与之所有条件符合的结果
2)所以,需要把已有的字符串转化为字符数组,这样才能对单个字符进行处理
3)其次,根据两个数组每一轮的比较是否匹配来判断是否继续往下匹配
4)如果遇到不匹配的情况,需要重置第二个数组的匹配位置,并且第一个数组需要调整到i - j + 1的位置

开始动手!

package basic;

public class ViolenceMatch {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		// 暴力匹配算法测试
		String str1 = "Hello World,Hellowwhelloworld";
		String str2 = "world";
		System.out.println("index = " + violenceMatch(str1, str2));
	}

	// 暴力匹配算法实现
	public static int violenceMatch(String str1, String str2) {
		char[] s1 = str1.toCharArray();// 字符串转化为字符数组,返回值为char[]类型
		char[] s2 = str2.toCharArray();
		
		int s1Len = s1.length;
		int s2Len = s2.length;
		
		int i = 0;
		int j = 0;
		while(i < s1Len && j < s2Len) {//保证匹配时,不越界
			
			if(s1[i] == s2[j]) { // 匹配
				i++;
				j++;
			}else { // 不匹配,重置i,j
				i = i - (j - 1);
				j = 0;
			}
		}
		
		// 判断是否匹配成功,根据j的值
		if(j != 0) {
			return i-j;
		}else {
			return -1;
		}
	}
}

小结(先理一下):

1)暴力破解法对计算机资源耗费太严重,它需要多次重复比对,这个例子数据少一些,大家可能感觉不出来。如果条件太复杂,比对次数增加,与此同时,运算速度减慢,暴力算法的弊端也就显而易见了。
2)解决暴力算法这些弊端有两个办法。方法一,换汤不换药,把一些不必要的条件进行限制,以此减少资源的浪费。方法二,使用KMP算法

强调最后一点,以上并不是说,暴力算法就不用学了,有时候没思路的时候,可以使用暴力算法理清思路或者解决燃眉之急。大家就跟我一起理思路吧,下期出一个KMP算法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值