活动地址:优快云21天学习挑战赛
归结起来,焦虑的原因就两条:想同时做很多事,又想立即看到效果.一步一个脚印,加油!
1.算法概要
俗话说的好,万丈高楼平地起,而楼的高度又取决于你的地基,可见基础对上层的重要性,今天我们就一起来学习一下字符串匹配算法中的基础算法-BF(Brute Force, 暴力匹配)算法,也称为朴素算法,其核心思想就是从左到右移动模式串,直到全部匹配成功,如果匹配失败则重新匹配,直到不能匹配(失败),或者匹配完成。
2.算法实现
虽然,暴力匹配的算法思想很简单,但其也有好几种实现方式,这里我们先说一下比较好理解的一种方式,如下所示。
2.1 实现方式一
public int indexOf(String text, String pattern) {
// 初始化参数,排除无效的参数
int tLen = text.length();
int pLen = pattern.length();
if (tLen == 0 || pLen == 0 || pLen > tLen) return -1;
// 匹配主逻辑
int tIndex = 0;
int pIndex = 0;
while (tIndex < tLen && pIndex < pLen) {
if (text.charAt(tIndex) == pattern.charAt(pIndex)) {
tIndex++;
pIndex++;
} else {
tIndex -= pIndex - 1;
pIndex = 0;
}
}
if (pIndex == pLen) return tIndex;
return -1;
}
如上,代码第10行对当前位置进行了字符匹配,如果匹配成功,则主串下标和模式串下标都前进1个字符;如果匹配失败,则将主串移动到最初匹配位置的下一个位置(pIndex - 1),模式串位置归零,表示从新开始匹配。最后退出时有两种情况,一种是主串下标越界,另外一种则是模式串下标越界,如果是模式串下标越界显然是匹配成功,如上代码第18行对该条件进行了判断。
当然,我们可以发现,主串并不需要匹配 tLen 才结束循环,假设主串剩余的匹配长度不足模式串的长度,那显然是一定不能匹配成功的,于是我们可以对以上代码的while循环条件进行一定的改动,修改条件为 tIndex - pIndex <= tLen - pLen && pIndex < pLen 。
2.2实现方式二
还有一种实现方式如下,让主串下标一直前进,对于模式串的匹配如果中间匹配失败则跳出当前匹配,如果匹配成功,则返回匹配成功的位置
public int indexOf(String text, String pattern) {
// 初始化参数,排除无效的参数
int tLen = text.length();
int pLen = pattern.length();
if (tLen == 0 || pLen == 0 || pLen > tLen) return -1;
// 匹配主逻辑
for (int tIndex = 0; tIndex <= tLen - pLen; tIndex++) {
int pIndex = 0;
for (; pIndex < pLen; pIndex++) {
if (text.charAt(tIndex + pIndex) != pattern.charAt(pIndex)) break;
}
if (pIndex == pLen) return tIndex;
}
return -1;
}
本文深入探讨了字符串匹配算法中的基础——BF(BruteForce)算法,也称朴素算法。该算法通过从左到右逐个字符比较来寻找模式串在主串中的位置。文中详细解释了两种不同的实现方式,并通过代码示例进行说明,强调了算法的核心思想和优化技巧。
542

被折叠的 条评论
为什么被折叠?



