字符串暴力匹配算法详解
说明
- 字符串暴力匹配算法是指在一个长字符串中暴力寻找是否包含某一子串
- 所谓暴力匹配,就是不使用任何其他算法,将两个字符串中的字符一一进行比对
- 从长字符串的第一个字符开始,判断是否和子字符串的第一个字符相等,如果相等,则在比较后面的字符
- 如果第一个字符就不相等,则通过指针后移依次判断长字符串后边的字符是否和第一个字符相等,直到字符串末尾
- 一旦在长字符串中匹配到子字符串的第一个字符,就依次再比较后边的字符
- 如果后边的字符匹配不成功,则重置长字符串索引为当前开始索引的下一个,重置子字符串索引为0,重复前边的步骤
- 循环结束条件就是长字符串遍历结束或者子字符串遍历结束
- 循环结束后通过判断指向子字符串的索引大小判断是否匹配到,即如果匹配到,则索引大小应该为子字符串长度大小,否则就没有匹配到
- 匹配到则返回i开始匹配位置的索引,没有匹配到则返回-1
- 源码见下
源码及分析
package algorithm.algorithm.kmp;
/**
* @author AIMX_INFO
* @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 = " + index);
}
//暴力匹配算法实现
/**
* @param str1 原始字符串
* @param str2 要匹配的字符串
* @return 返回匹配的结果
*/
public static int violenceMatch(String str1, String str2) {
//将字符串转为字符数组
char[] c1 = str1.toCharArray();
char[] c2 = str2.toCharArray();
//记录长度
int c1Len = c1.length;
int c2Len = c2.length;
//定义变量 i , j 用于遍历
int i = 0;
int j = 0;
//遍历str1和str2循环比较
while (i < c1Len && j < c2Len) {
//如果第一个字符串的某一位和第二个字符串的第一位匹配,则判断后边是否继续匹配
if (c1[i] == c2[j]) {
i++;
j++;
} else {
//如果不匹配,则重置 i 和 j 重新开始匹配
i = i - (j - 1);
j = 0;
}
}
//循环结束后根据j的大小判断是否匹配到,如果匹配到返回索引
if (j == c2Len) {
return i - j;
} else {
//如果没有匹配到返回-1
return -1;
}
}
}