多字符串查找算法:kmp与step
1,计算kmp失败回退函数:
public static int[] getKmpFail(String pattern) {if (!hasLength(pattern)) throw new IllegalArgumentException("null or empty pattern is not allowed to get kmp fail array.");int i, j, len = pattern.length();int[] fail = new int[len];fail[0] = -1;for (j = 1; j < len; j++) {i = fail[j - 1];while ((pattern.charAt(j) != pattern.charAt(i + 1)) && (i >= 0)) {i = fail[i];}if (pattern.charAt(j) == pattern.charAt(i + 1)) {fail[j] = i + 1;} else {fail[j] = -1;}}return fail;}
2,查找子串:
public static int kmpIndexOf(String source, String pattern, int from, int[] fail, int to) {int i = from, j = 0, lenp = pattern.length();while ((i < to) && (j < lenp)) {if (source.charAt(i) == pattern.charAt(j)) {i++;j++;} else {if (j == 0) {i++;} else {j = fail[j - 1] + 1;}}}return (j == lenp) ? (i - lenp) : -1;}
3,kmp多字符串查找:
public static int[] kmpFirstMatch(String source, String[] patterns, int from, int[][] fails) {int[] indices = { -1, -1 };int to = source.length();for (int i = 0; i < patterns.length; i++) {//多次遍历source查找patterns[i]if(to - from < patterns[i].length()) continue;int index = kmpIndexOf(source, patterns[i], from, fails[i], to);if (index != -1 && (index < indices[0] || indices[0] == -1)) {indices[0] = to = index;//缩小范围,to之后的不用查找了indices[1] = patterns[i].length();//返回目标索引和长度to++;//if(from == index) break;上面的continue更优化}}return indices;}
4,step多字符串查找:
public static int[] stepFirstMatch(char[] sources, int from, char[][] chars) {int[] indices = { -1, -1 };for (int i = from; i < sources.length; i++) {//从头至尾依次查找for (int j = 0; j < chars.length; j++) {if (sources[i] == chars[j][0]) {int k = 1;while (k < chars[j].length && i + k < sources.length && sources[i + k] == chars[j][k])k++;if (k == chars[j].length) {indices[0] = i;indices[1] = k;return indices;//找到就立即返回}}}}return indices;}
step比kmp方式要快一点,大概是基本类型上占些优势。
找到stepFirstMatch的一个合适用法:生成随机充值码时排出相似字符串!
//检查相似字符不能同时出现,生成的随机码串调用checkNoSimilarPairs(randomString)即可。private static String[] similarPairsString = {"0O", "1I", "2Z", "VY"};private static char[][] similarPairs = null;static {similarPairs = new char[similarPairsString.length*2][];for(int i = 0; i < similarPairsString.length; i++) {similarPairs[2*i] = similarPairsString[i].toCharArray();similarPairs[2*i + 1] = new StringBuilder(similarPairsString[i]).reverse().toString().toCharArray();}}private boolean checkNoSimilarPairs(String source) {return stepFirstMatch(source.toCharArray(), 0, similarPairs)[0] == -1;}
转载于:https://www.cnblogs.com/xingqi/archive/2011/05/06/2039225.html
多字符串查找算法:kmp与step相关推荐
- 暴力子字符串查找算法
暴力子字符串查找算法的名字虽然很霸气,但是效率不是很高.是一种简单.粗暴的查找方式. 在最坏的情况下,暴力子字符串查找算法在长度为N的文本中查找长度为M的模式需要~NM次字符比较. 核心思想:就是对主 ...
- Rabin-Karp 指纹字符串查找算法
Rabin-Karp 指纹字符串查找算法 M.O.Rabin 和 R.A.Karp 发明了一种完全不同的基于散列的字符串查找算法.我们需要计算模式字符串的散列函数,然后用相同的散列函数计算文本中所有可 ...
- 字符串查找算法BF、KMP详解
字符串查找: BF算法: (朴素查找算法) 当查找不成功时,主串返回刚刚起始字符的下一个,子串返回第一个字符位置 时间复杂度:O(n*m) int BF(const char* str, const ...
- KMP(Knuth-Morris-Pratt) 字符串查找算法
1.背景 我接触到这个算法是在力扣的每日一题中(28. 实现 strStr()),这本来只是一个分类为简单的题目.但是却在官方题解中介绍了这个看似十分复杂的算法. 在官方题解中给出了详细的证明 ...
- Rabin-Karp字符串查找算法学习:poj1200
本来准备学习Hash的,结果看PPT讲的第一个算法竟然是跟字符串处理相关的,本来Hash中也有一块专门讲字符串Hash的,就按照<算法导论>中的分类,把这个分到"字符串处理&qu ...
- KMP- Knuth-Morris-Pratt 字符串查找算法
2019独角兽企业重金招聘Python工程师标准>>> TBD 转载于:https://my.oschina.net/u/1041012/blog/954965
- 【字符串】字符串查找 ( Rabin-Karp 算法 )
文章目录 一.字符串查找 二.Rabin-Karp 算法 一.字符串查找 算法题目链接 : https://www.lintcode.com/problem/13/ 在 一个字符串 中查找 另外一个字 ...
- 【字符串】字符串查找 ( 蛮力算法 )
文章目录 一.字符串查找 二.蛮力算法代码示例 一.字符串查找 算法题目链接 : https://www.lintcode.com/problem/13/ 在 一个字符串 中查找 另外一个字符串 第一 ...
- iptables --algo 字符串匹配算法 bm kmp
http://blog.csdn.net/l953972252/article/details/51331001 字符串匹配一直是计算机领域热门的研究问题之一,多种算法层出不穷.字符串匹配算法有着很强 ...
- 字符串之子字符串查找
子字符串查找 字符串的一种基本操作就是子字符串查找:给定一段长度为N的文本text和一个长度为M的模式字符串pattern,在文本中找到一个和该模式相符的子字符串.解决该问题的大部分算法都可以很容 ...
最新文章
- 数据蒋堂 | SQL是描述性语言?
- CodeForces 597A Divisibility
- python读文件的三个方法read()、readline()、readlines()详解
- Yii设置响应数据的样式与内容
- Session、Dialog和Transaction的区别
- c语言编程输出数组元素之和,C语言 输出一个数组中,所有元素之和为0的子序列...
- Ubuntu——安装中文拼音输入法
- Ajax请求URL后加随机数原理
- xmlObj转为数组
- java web 题_Java+web考试题预备
- pip 更新python -m pip install --upgrade pip 报错
- 运算放大器:加法电路
- VSCode配置Python教程
- 大数据AI Notebook产品介绍和对比
- html动画如何延迟,css3animation延迟
- 最简单DIY基于ESP32CAM的物联网相机系统③(在JSP服务器图传相片给所有客户端欣赏)
- Activity毛玻璃背景效果
- java实现ln10_Java数学函数
- 【论文】AlexNet 一
- 前端工程师 - 面试题 (最新,最全)