kmp字符串查询算法
kmp字符串查询算法
1 普通的字符串查询
普通的字符串查询是遍历被查找的字符串,然后和key字符串进行匹配,如果不一致,则,被查找的字符串+1,继续向下遍历。
代码如下:
private static void search(String str, String key) {char strArr[] = str.toCharArray();char keyArr[] = key.toCharArray();int i = 0, j = 0;int n = 0;while (i < strArr.length && j < keyArr.length) {n++;if (strArr[i] == keyArr[j]) {i++;j++;} else {i = i + 1 - j;j = 0;}}if (j == keyArr.length) {System.out.println(true);System.out.println(n);System.out.println(i - j + 1);}
}
2 KMP查询
kmp查询的是和普通唯一不同的是i在遍历后发现不同的时候的跳跃的个数不是1。
比较难的是next数组的计算,next数组计算的时候计算的是最长子前缀和最长子后缀的相同字符的数量。
比如,ABABABA,对于第四个字符B,ABAB他的前缀是B BA BAB ,后缀是A BA ABA,所以next[4] = 1。
对于next数组的计算,暂时没有特别明白。
代码如下:
private static void kmpSearch(String str, String key) {char strArr[] = str.toCharArray();char keyArr[] = key.toCharArray();int[] next = getNext(key);for (int i : next) {System.out.print(i + ",");}int i = 0, j = 0;int n = 0;while (i < strArr.length && j < keyArr.length) {n++;if (strArr[i] == keyArr[j]) {i++;j++;} else {i = i + j - next[j];j = 0;}}if (j == keyArr.length) {System.out.println(true);System.out.println(n);System.out.println("=====================");System.out.println(i - j + 1);}
}public static int[] getNext(String ps) {int next[] = new int[ps.length()];char[] p = ps.toCharArray();next[0] = -1;int k = -1;int j = 0;while (j < ps.length() - 1) {// p[k]表示前缀,p[j]表示后缀if (k == -1 || p[j] == p[k]) {++k;++j;next[j] = k;} else {k = next[k];}}return next;
}
kmp字符串查询算法相关推荐
- KMP —— 字符串分析算法
同学们好,我是来自 <技术银河>的
- KMP(Knuth-Morris-Pratt) 字符串查找算法
1.背景 我接触到这个算法是在力扣的每日一题中(28. 实现 strStr()),这本来只是一个分类为简单的题目.但是却在官方题解中介绍了这个看似十分复杂的算法. 在官方题解中给出了详细的证明 ...
- Algorithm:C++语言实现之字符串相关算法(字符串的循环左移、字符串的全排列、带有同个字符的全排列、串匹配问题的BF算法和KMP算法)
Algorithm:C++语言实现之字符串相关算法(字符串的循环左移.字符串的全排列.带有同个字符的全排列.串匹配问题的BF算法和KMP算法) 目录 一.字符串的算法 1.字符串的循环左移 2.字符串 ...
- KMP字符串模式匹配详解
KMP字符串模式匹配详解 KMP字符串模式匹配通俗点说就是一种在一个字符串中定位另一个串的高效算法.简单匹配算法的时间复杂度为O(m*n);KMP匹配算法.可以证明它的时间复杂度为O(m+n).. 一 ...
- 暴力子字符串查找算法
暴力子字符串查找算法的名字虽然很霸气,但是效率不是很高.是一种简单.粗暴的查找方式. 在最坏的情况下,暴力子字符串查找算法在长度为N的文本中查找长度为M的模式需要~NM次字符比较. 核心思想:就是对主 ...
- 汉语词典快速查询算法研究
原贴:http://www.nlp.org.cn/docs/docredirect.php?doc_id=1118 汉语词典快速查询算法研究 李江波 周强 陈祖舜 (清华大学智能技术与系统国家重点实验 ...
- KMP字符串模式匹配
KMP 字符串基本概念 字符串 S:无特殊说明,字符串仅由26个小写字母'a'-'z',并用大写字母表示一个字符串 S="abcd" |S|:表示一个字符串的长度 |S|=4 S[ ...
- 字典树 —— 字符串分析算法
这里我们继续来编程训练,在<前端进阶>这个系列里面我们已经讲过一些字符串的算法了.然后这篇文章我们就来一起学习,剩下的几个字符串中比较细节的算法. 字符串分析算法 在开始之前我们先来看看字 ...
- 大数据算法系列10:字符串检验算法
文章目录 一. 字符串检验算法 二. 练习 2.1 面试题(输出字符串的排列组合) 2.2 POJ2262(求奇质素之和) 2.3 开门游戏 2.4 Uva106(费马大定律) 2.5 POJ3744 ...
最新文章
- 关于 automation服务器对象不能创建
- 【poj2983】 Is the Information Reliable?
- ASP无组件上传带进度条
- 信息学奥赛一本通(1322:【例6.4】拦截导弹问题(Noip1999))
- 【Flink】flink zookeeper HA 实现分析
- 谷歌插件开发ajax请求,2020-01-03(chrome插件:拦截ajax请求并修改返回结果)
- 2022-2027年中国衬衫行业市场调研及未来发展趋势预测报告
- box-sizing属性的理解
- 数学建模:线性规划—奶制品的生产销售计划模型 (Python 求解)
- 科技爱好者周刊(第 209 期):程序员是怎样的人
- 测试吃鸡fps软件,GTX1050Ti吃鸡足矣 2017热销游戏本吃鸡横评
- 使用ssh工具登录亚马逊云服务器
- 非常好听但比较难找的歌曲
- word/excel 里的表格如何到PS里使用
- 漫漫软考路-考后总结
- 码分多址(CDMA),码片序列简单理解
- 最后一本书 第六章课后练习3,4
- 数字图像处理,自适应中值滤波的C++实现
- 三种循环的流程图画法总结 [转]
- pip 安装protobuf_Python3.6安装protobuf模块+将proto文件转换成pb2.py文件
热门文章
- vpython 贞测碰撞_7、Pygame碰撞检测
- Android实现相册分享功能,Android系统自带分享功能的实现(可同时分享文字和图片)...
- java error与exception_Java中Error与Exception的区别
- 【小白学习PyTorch教程】十九、 基于torch实现UNet 图像分割模型
- 计算未来轻沙龙 | 顶会论文相继放榜,NLP领域有哪些最新进展?
- 【百度飞浆】目标检测综述
- python——LeetCode刷题
- SpringCloud 在每次使用缓存的请求前后对HystrixRequestContext进行初始化和关闭,否则会出现异常
- MyBatis和hibernate本质区别与应用场景
- protobuf windows java_protobuf windows java 环境搭建