模式匹配(Java)
模式匹配
模式匹配是数据结构中字符串的一种基本运算。
由于字符串我们学习过了,大部分操作都比较清楚,但是模式匹配相对来说操作稍微有些难度,所以我们在这里简单的进行讲述。
模式匹配的具体操作如下:给定一个子串(也称为模式串),要求在某个字符串中找出与该子串相同的所有子串。
我们在此讲述2种常见实现:
- 暴力匹配
- KMP算法
暴力匹配(BF算法)
主要思想:从主串的第一个元素开始,与模式串第一个元素相比较,相等则逐一比较,若有不同元素,主串回溯至下一个元素,与模式串的一个元素相比较,依次循环。
为了方便讲解,我们针对下面的案例来进行讲解:
要求在寻找模式串第一次在主串出现的位置,未找到则返回-1。
我们把这个过程分为5步:
- 首先,我们需要将主串进行遍历。
- 主串的每一次遍历中,与模式串进行比较,若相同比较下一个元素。
- 如果模式串比较结束,说明模式串成功匹配,返回主串当前下标。
- 如果两元素不同,说明此处匹配失败,主串继续遍历下一个元素。
- 若主串遍历结束,仍未成功匹配,则说明主串中无该模式串,返回-1。
我们举个例子演示一下,假设主串abdabcda,模式串abcd,模式匹配后应当得到3。
主串当前遍历到的元素/下标 | 主串的元素 | 模式串元素 | 比较 |
---|---|---|---|
a/0 | a | a | 相等,比较下一个元素 |
a/0 | b | b | 相等,比较下一个元素 |
a/0 | d | c | 不相等,回溯,继续遍历主串 |
b/1 | b | a | 不相等,回溯,继续遍历主串 |
d/2 | d | a | 不相等,回溯,继续遍历主串 |
a/3 | a | a | 相等,比较下一个元素 |
a/3 | b | b | 相等,比较下一个元素 |
a/3 | c | c | 相等,比较下一个元素 |
a/3 | d | d | 相等,比较下一个元素 |
a/3 | a | \0 | 模式串比较结束,匹配成功 |
完整代码如下
public static int bruteForceStringMatch(String str, String pattern) {
//如果主串长度不小于模式串,则进入模式匹配
if (str.length() >= pattern.length()) {
//获取两串的字符数组,以便遍历
char strOfChars[] = str.toCharArray();
char patternOfChars[] = pattern.toCharArray();
//两个循环控制变量
int loopOfStr, loopOfPattern;
//遍历主串,任意一串遍历结束,则匹配结束