1.什么是暴力匹配?
字符串暴力匹配算法是指在一个长字符串中暴力寻找是否包含某一子串
所谓暴力匹配,就是不使用任何其他算法,将两个字符串中的字符一一进行比对。从长字符串的第一个字符开始,判断是否和子字符串的第一个字符相等,如果相等,则在比较后面的字符。
如果第一个字符就不相等,则通过指针后移依次判断长字符串后边的字符是否和第一个字符相等,直到字符串末尾。
一旦在长字符串中匹配到子字符串的第一个字符,就依次再比较后边的字符
如果后边的字符匹配不成功,则重置长字符串索引为当前开始索引的下一个,重置子字符串索引为0,重复前边的步骤。
循环结束条件就是长字符串遍历结束或者子字符串遍历结束。
循环结束后通过判断指向子字符串的索引大小判断是否匹配到,即如果匹配到,则索引大小应该为子字符串长度大小,否则就没有匹配到
匹配到则返回i开始匹配位置的索引,没有匹配到则返回-1。
2.代码示例:
package com.common.utils;
/**
* @ClassName ViolenceMatch
* @Description: 用java实现暴力匹配算法代码示例
* @Author: mischen
* @date: 19:57 2022/12/8
* @Version 1.0
*/
public class ViolenceMatch {
public static void main(String[] args) {
String str1 = "abcdABCabcdAbcd~GG";
String str2 = "cd";
int index = violenceMatch(str1, str2);
System.out.println("下标为:" + index);
}
//实现1
private static int violenceMatch(String str1, String str2) {
char[] s1 = str1.toCharArray();
char[] s2 = str2.toCharArray();
int len1 = s1.length;
int len2 = s2.length;
//分别指向s1和s2
int i = 0;
int j = 0;
//保证匹配时不越界
while (i < len1 && j < len2) {
if (s1[i] == s2[j]) {
i++;
j++;
} else {
i = i - (j - 1);
j = 0;
}
}
//判断匹配成功
if (j == len2) {
return i - j;
} else {
return -1;
}
}
/**
* 实现2
* @param ptr 文本串
* @param pat 模式串
* @return 如果存在,返回这个子串的其实索引,否则返回-1
*/
private static int violanceMatch2(String ptr, String pat) {
int N = ptr.length();
int M = pat.length();
if(M > N) {
return -1;
}
for(int i=0; i < N - M; i++) {
int j;
for(j = 0; j < M; j++) {
if(ptr.charAt(i + j) != pat.charAt(j)) {
break;
}
}
//模式串都匹配成功了
if(j == M) {
return i;
}
}
return -1;
}
}