《漫画算法2》源码整理-4 字符串匹配算法 RK KMP
RK算法
public class RabinKarp {public static int rabinKarp(String str, String pattern) {//主串长度int m = str.length();//模式串的长度int n = pattern.length();//计算模式串的hash值int patternCode = hash(pattern);//计算主串当中第一个和模式串等长的子串hash值int strCode = hash(str.substring(0, n));//用模式串的hash值和主串的局部hash值比较。//如果匹配,则进行精确比较;如果不匹配,计算主串中相邻子串的hash值。for (int i = 0; i < (m - n + 1); i++) {if ((strCode == patternCode) && compareString(i, str, pattern)) {return i;}//如果不是最后一轮,更新主串从i到i+n的hash值if (i < (m - n)) {strCode = nextHash(str, strCode, i, n);}}return -1;}private static int hash(String str) {int hashcode = 0;//这里采用最简单的hashcode计算方式://把a当做1,把b当中2,把c当中3.....然后按位相加for (int i = 0; i < str.length(); i++) {hashcode += (str.charAt(i) - 'a');}return hashcode;}private static int nextHash(String str, int hash, int index, int n) {hash -= (str.charAt(index) - 'a');hash += (str.charAt(index + n) - 'a');return hash;}private static boolean compareString(int i, String str, String pattern) {String strSub = str.substring(i, i + pattern.length());return strSub.equals(pattern);}public static void main(String[] args) {String str = "aacdesadsdfer";String pattern = "adsd";System.out.println("第一次出现的位置:" + rabinKarp(str, pattern));}
}
KMP算法
public class KMP {// KMP算法主体逻辑。str是主串,pattern是模式串public static int kmp(String str, String pattern) {//预处理,生成next数组int[] next = getNexts(pattern);int j = 0;//主循环,遍历主串字符for (int i = 0; i < str.length(); i++) {while ((j > 0) && (str.charAt(i) != pattern.charAt(j))) {//遇到坏字符时,查询next数组并改变模式串的起点j = next[j];}if (str.charAt(i) == pattern.charAt(j)) {j++;}if (j == pattern.length()) {//匹配成功,返回下标return i - pattern.length() + 1;}}return -1;}// 生成Next数组private static int[] getNexts(String pattern) {int[] next = new int[pattern.length()];int j = 0;for (int i = 2; i < pattern.length(); i++) {while ((j != 0) && (pattern.charAt(j) != pattern.charAt(i - 1))) {//从next[i+1]的求解回溯到 next[j]j = next[j];}if (pattern.charAt(j) == pattern.charAt(i - 1)) {j++;}next[i] = j;}return next;}public static void main(String[] args) {String str = "ATGTGAGCTGGTGTGTGCFAA";String pattern = "GTGTGCF";int index = kmp(str, pattern);System.out.println("首次出现位置:" + index);}
}
《漫画算法2》源码整理-4 字符串匹配算法 RK KMP相关推荐
- 《漫画算法》源码整理-5 排序算法
冒泡排序 import java.util.Arrays;public class BubbleSort {public static void sort(int array[]){int tmp = ...
- 《漫画算法》源码整理-7
MyBitmap public class MyBitmap {//每一个word是一个long类型元素,对应64位二进制private long[] words;//bitmap的位数大小priva ...
- 《漫画算法》源码整理-6
判断链表有环 public class LinkedListCycle {/*** 判断是否有环* @param head 链表头节点*/public static boolean isCycle(N ...
- 《漫画算法》源码整理-4 大顶堆 小顶堆 优先队列
堆操作 import java.util.Arrays;public class HeapOperator {/*** 上浮调整* @param array 待调整的堆*/public static ...
- 《漫画算法》源码整理-3 二叉树遍历
二叉树前序 中序 后序 遍历 import java.util.Arrays; import java.util.LinkedList;public class BinaryTreeTraversal ...
- 《漫画算法》源码整理-2 数组 链表 队列
数组操作 public class MyArray {private int[] array;private int size;public MyArray(int capacity){this.ar ...
- 《漫画算法》源码整理-1 时间复杂度 空间复杂度
时间复杂度 public class TimeComplex {void eat1(int n){for(int i=0; i<n; i++){;System.out.println(" ...
- Python实现16进制转10进制算法及源码
Python实现16进制转10进制算法及源码 16进制是一种常用的数学计数方式,而在Python中将16进制数据转换为10进制数据是非常简单和快捷的.下面我将展示如何使用Python实现16进制转10 ...
- 分裂层次聚类matlab实现,凝聚层次聚类算法matlab源码
<凝聚层次聚类算法matlab源码>由会员分享,可在线阅读,更多相关<凝聚层次聚类算法matlab源码(3页珍藏版)>请在人人文库网上搜索. 1.共享一个在数据挖掘课程中作为示 ...
最新文章
- Python赋值运算符(入门必读)
- 鱼和熊掌可以兼得! 天昊生物微生物16S扩增子绝对定量测序检测新模式创双赢!...
- 2020年生肖码表图_2020年最好的计时码表,是这4款
- [转]js escape,encodeURI,encodeURIComponent
- server2012 r2搭建双DNS
- Mysql多表查询(案例1)
- 全球及中国梦幻体育软件和平台行业十四五规模展望及应用价值分析报告2021-2027年
- Windows下cmd常用命令【5分钟掌握】
- mysql server出现_查询各阶段时,一旦mysql server出现各种故障下的表现形式
- 美国政府发布关键海事行业的网络安全规划
- [转载] JAVA出现空指针异常(初学者)
- 算法课 - 最大流问题
- 图像处理边缘处理:Roberts算子和canny算子,对圆与矩阵进行识别
- java实现lda模型_lda模型 java
- PHP获取今日农历日期
- K8S学习之容器探测 livenessProbe、readinessProbe、startupProbe、lifecycle
- 《管理信息系统》考研复试整理
- Linux bc小数点前补0
- 解决AD22拼版导出Gerber时DFM无法正确识别板框
- ORB-SLAM2源码笔记(1)——框架结构
热门文章
- kafka入门:简介、使用场景、设计原理、主要配置及集群搭建--转载
- Lesson13【加餐】 损失函数的随机创建现象详解
- 在Docker启动Cloudera并开始体验
- 吴恩达Deeplearning.ai课程学习全体验:深度学习必备课程 By 路雪2017年8月14日 11:44 8 月 8 日,吴恩达正式发布了 Deepleanring.ai——基于 Cours
- 深度机器学习中的batch的大小对学习效果有何影响?
- Java8 - Future 接口
- Spring-AOP概述
- 第一篇博客——用来写自己
- 学习笔记Kafka(五)—— Kafka 开发环境配置及Producer API
- python 冒泡排序算法(超级详细)