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相关推荐

  1. 暴力子字符串查找算法

    暴力子字符串查找算法的名字虽然很霸气,但是效率不是很高.是一种简单.粗暴的查找方式. 在最坏的情况下,暴力子字符串查找算法在长度为N的文本中查找长度为M的模式需要~NM次字符比较. 核心思想:就是对主 ...

  2. Rabin-Karp 指纹字符串查找算法

    Rabin-Karp 指纹字符串查找算法 M.O.Rabin 和 R.A.Karp 发明了一种完全不同的基于散列的字符串查找算法.我们需要计算模式字符串的散列函数,然后用相同的散列函数计算文本中所有可 ...

  3. 字符串查找算法BF、KMP详解

    字符串查找: BF算法: (朴素查找算法) 当查找不成功时,主串返回刚刚起始字符的下一个,子串返回第一个字符位置 时间复杂度:O(n*m) int BF(const char* str, const ...

  4. KMP(Knuth-Morris-Pratt) 字符串查找算法

    1.背景   我接触到这个算法是在力扣的每日一题中(28. 实现 strStr()),这本来只是一个分类为简单的题目.但是却在官方题解中介绍了这个看似十分复杂的算法.   在官方题解中给出了详细的证明 ...

  5. Rabin-Karp字符串查找算法学习:poj1200

    本来准备学习Hash的,结果看PPT讲的第一个算法竟然是跟字符串处理相关的,本来Hash中也有一块专门讲字符串Hash的,就按照<算法导论>中的分类,把这个分到"字符串处理&qu ...

  6. KMP- Knuth-Morris-Pratt 字符串查找算法

    2019独角兽企业重金招聘Python工程师标准>>> TBD 转载于:https://my.oschina.net/u/1041012/blog/954965

  7. 【字符串】字符串查找 ( Rabin-Karp 算法 )

    文章目录 一.字符串查找 二.Rabin-Karp 算法 一.字符串查找 算法题目链接 : https://www.lintcode.com/problem/13/ 在 一个字符串 中查找 另外一个字 ...

  8. 【字符串】字符串查找 ( 蛮力算法 )

    文章目录 一.字符串查找 二.蛮力算法代码示例 一.字符串查找 算法题目链接 : https://www.lintcode.com/problem/13/ 在 一个字符串 中查找 另外一个字符串 第一 ...

  9. iptables --algo 字符串匹配算法 bm kmp

    http://blog.csdn.net/l953972252/article/details/51331001 字符串匹配一直是计算机领域热门的研究问题之一,多种算法层出不穷.字符串匹配算法有着很强 ...

  10. 字符串之子字符串查找

    子字符串查找   字符串的一种基本操作就是子字符串查找:给定一段长度为N的文本text和一个长度为M的模式字符串pattern,在文本中找到一个和该模式相符的子字符串.解决该问题的大部分算法都可以很容 ...

最新文章

  1. 数据蒋堂 | SQL是描述性语言?
  2. CodeForces 597A Divisibility
  3. python读文件的三个方法read()、readline()、readlines()详解
  4. Yii设置响应数据的样式与内容
  5. Session、Dialog和Transaction的区别
  6. c语言编程输出数组元素之和,C语言 输出一个数组中,所有元素之和为0的子序列...
  7. Ubuntu——安装中文拼音输入法
  8. Ajax请求URL后加随机数原理
  9. xmlObj转为数组
  10. java web 题_Java+web考试题预备
  11. pip 更新python -m pip install --upgrade pip 报错
  12. 运算放大器:加法电路
  13. VSCode配置Python教程
  14. 大数据AI Notebook产品介绍和对比
  15. html动画如何延迟,css3animation延迟
  16. 最简单DIY基于ESP32CAM的物联网相机系统③(在JSP服务器图传相片给所有客户端欣赏)
  17. Activity毛玻璃背景效果
  18. java实现ln10_Java数学函数
  19. 【论文】AlexNet 一
  20. 前端工程师 - 面试题 (最新,最全)

热门文章

  1. Git 分支 - 分支的新建
  2. [转]NetBeans开发Applet方法实例学习
  3. 【kafka】生产者速度测试
  4. xshell常用指令
  5. sql系列(基础篇)-第一章 关于sysdate
  6. 条款28:避免返回handles指向对象内部的成分(Avoid returning handles to objects internals)...
  7. Windows 2003 EE升级服务错误号:0x8DDD0018 解决办法
  8. CEGUI中文显示四步曲
  9. 游戏开发之游戏策划的基本原则
  10. 一次线上OOM过程的排查