问题:
1)有一个字符串 str1= ““abcdefg””,和一个子串 str2=“fg”
2)现在要判断 str1 是否含有 str2, 如果存在,就返回第一次出现的位置, 如果没有,则返回-1
暴力匹配:
0)假设现在 str1 匹配到 i 位置,子串 str2 匹配到 j 位置,则有:
1)如果当前字符匹配成功(即 str1[i] == str2[j]),则 i++,j++,继续匹配下一个字符
2)如果失配(即 str1[i]! = str2[j]),令 i = i - (j - 1),j = 0。相当于每次匹配失败时,i 回溯,j 被置为 0。
3)用暴力方法解决的话就会有大量的回溯,每次只移动一位,若是不匹配,移动到下一位接着判断,浪费了大量的时间。(采用KMP算法优化)
//暴力匹配
public class ViolentMatch {
public static void main(String[] args) {
String str1 = "abcde";
String str2 = "cde";
System.out.println(match(str1,str2));
}
public static int match(String str1, String str2) {
char[] cs1 = str1.toCharArray();
char[] cs2 = str2.toCharArray();
for (int i = 0,j = 0; i < cs1.length; i++) {
if (cs1[i] == cs2[j]) {
j++;
}else {
i=i-j;
j = 0;
}
if (j == cs2.length) {
return i - j + 1;
}
}
return -1;
}
}