暴力算法
题目:
字符串匹配问题:
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算法