通过优锐课核心java学习笔记中,我们可以看到KMP字符串模式匹配算法Java实现 ,码了很多专业的相关知识, 分享给大家参考学习。
从头到尾彻底理解KMP,并着重于Java实现 😃。 现有字符串匹配算法有不少,如简单暴力的朴素算法(暴力匹配算法)、KMP算法、BM算法以及Sunday算法等,在这里仅介绍前两种算法。
-
朴素算法
朴素算法即暴力匹配算法,对于长度为n的文本串S和长度为m模式串P,在文本串S中是否存在一个有效偏移i,其中 0≤ i < n - m + 1,使得 S[i… i+m - 1] = P[0 … m-1](注:下标从0开始),如果存在则匹配成功,否则匹配失败。由于在匹配过程中一旦不匹配,就要让模式串P相对于文本串S右移1,即i需要进行回溯,其时间复杂度为O(n*m)。
Java实现:
// 定义接口
interface StringMatcher {
/**
* 从原字符串中查找模式字符串的位置,如果模式字符串存在,则返回模式字符串第一次出现的位置,否则返回-1
*
* @param source
* 原字符串
* @param pattern
* 模式字符串
* @return if substring exists, return the first occurrence of pattern
* substring, return -1 if not.
/
int indexOf(String source, String pattern);
}
/*-
暴力匹配
-
-
时间复杂度: O(m*n), m = pattern.length, n = source.length
*/
class ViolentStringMatcher implements StringMatcher {@Override
public int indexOf(String source, String pattern) {
int i = 0, j = 0;
int sLen = source.length(), pLen = pattern.length();
char[] src = source.toCharArray();
char[] ptn = pattern.toCharArray();
while (i < sLen && j < pLen) {
if (src[i] == ptn[j]) {
// 如果当前字符匹配成功,则将两者各自增1,继续比较后面的字符
i++;
j++;
} else {
// 如果当前字符匹配不成功,则i回溯到此次匹配最开始的位置+1处,也就是i = i - j + 1
// (因为i,j是同步增长的), j = 0;
i = i - j + 1;
j = 0;
}
}
// 匹配成功,则返回模式字符串在原字符串中首
-