【校招VIP】Java暴力匹配算法——字符串匹配问题

1天前 收藏 0 评论 0 java开发

【校招VIP】Java暴力匹配算法——字符串匹配问题

转载声明:文章来源https://blog.csdn.net/qq_54836465/article/details/125722643?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522d898db4c55615c7ce45b41462beae610%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=d898db4c55615c7ce45b41462beae610&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~rank_v31_ecpm-15-125722643-null-null.142^v101^pc_search_result_base6&utm_term=%E5%AD%97%E7%AC%A6%E4%B8%B2%E5%8C%B9%E9%85%8D&spm=1018.2226.3001.4187

有一个字符串 str1 = "BCDABCDABABCDABCABCD",和一个字符串 str2 = "ABCAB"。
现在要判断 str1 是否含有 str2,如果存在,就返回第一次出现的位置,如果没有,则返回-1。

暴力匹配算法
一、解析
所谓暴力匹配,就是不使用任何其他算法,将两个字符串中的字符一一进行比对
如果用暴力匹配的思路,并假设现在str1匹配到i位置,子串 str2 匹配到i位置,则有:
(1)如果当前字符匹配成功(即 str1[i] == str2[i] ),则i++,j++,继续匹配下一个字。
(2)如果匹配失败(即 str1[i] != str2[i] ),令 i = i - j + 1,j = 0。相当于每次匹配失败时,i回溯到起始位的下一个下标,i 被置为0。

用暴力方法解决的话就会有大量的回溯,每次只移动一位,若是不匹配,移动到下一位接着判断,会浪费了大量的时间。

二、图解
1、首先,用 str1 的第一个字符和 str2 第一个字符去比较不符合,关键词向后移动一位。


2、重复第一步,若还是不符合,则继续向后移动

3、一直重复,直到 str1 有一个字符与 str2 的第一个字符相同为止。 

4、一直重复,直到 str1 有一个字符与 str2 对应的字符不符合。


5、指针回溯到一开始发现字符相同时的下一个字符,重复第一步 。


三、代码演示

public class ViolenceMatch {
public static void main(String[] args) {
//测试u
String s1 = "BCDABCDABABCDABCABCD";
String s2 = "ABCAB";
System.out.println(violenceMatch(s1,s2));
}

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;
}
}

}

四、输出结果


五、优化
暴力匹配算法的回溯过多,我们可以使用KMP算法来对此进行优化,从而减少运算所需的时间,提高程序性能。

C 0条回复 评论

帖子还没人回复快来抢沙发