算法笔记_009:字符串匹配(Java)
1 问题描述
给定一个n个字符组成的串(称为文本),一个m(m <= n)的串(称为模式),从文本中寻找匹配模式的子串。
2 解决方案
2.1 蛮力法
package com.liuzhen.chapterThree;
public class BruteForceStringMatch {
//根据文本串N,和模式串M,返回第一个匹配模式串的子串在N中的位置
public static int getStringMatch(int[] N , int[] M){
int n = N.length; //文本串的长度
int m = M.length; //模式串的长度
for(int i = 0;i < n-m;i++){ //最后一轮子串匹配的起始位置是n-m,如果大于n-m一定不会出现匹配子串
int j = 0;
while(j < m && M[j] == N[i+j])
j = j +1;
if(j == m)
return i;
}
return -1;
}
public static void main(String args[]){
int[] N = {1,2,3,2,4,5,6,7,8,9};
int[] M = {6,7,8};
int position = getStringMatch(N,M);
System.out.println("文本串N中第"+position+"位开始,可以寻找一个匹配模式M的子串,该位置字符值为:"+N[position]);
}
}
运行结果:
文本串N中第6位开始,可以寻找一个匹配模式M的子串,该位置字符值为:6
2.2 KMP模式匹配法
package com.liuzhen.practice;
public class Main {
//获取匹配字符串B的next函数值
public int[] getNext(String B) {
char[] arrayB = B.toCharArray();
int[] next = new int[arrayB.length + 1];
int j = 0;
for(int i = 1;i < arrayB.length;i++) {
while(j > 0 && arrayB[i] != arrayB[j])
j = next[j];
if(arrayB[i] == arrayB[j])
j++;
next[i + 1] = j;
}
return next;
}
//输出B在A中出现匹配子串所有情况的第一个位置
public void getKMP(String A, String B) {
int[] next = getNext(B);
char[] arrayA = A.toCharArray();
char[] arrayB = B.toCharArray();
int j = 0;
for(int i = 0;i < arrayA.length;i++) {
while(j > 0 && arrayA[i] != arrayB[j])
j = next[j];
if(arrayA[i] == arrayB[j])
j++;
if(j == arrayB.length) {
System.out.println("开始匹配位置:"+(i - j + 1));
j = 0; //重新开始新的匹配检查
}
}
return;
}
public static void main(String[] args) {
Main test = new Main();
String A = "bbaabbbbbaabbbbaabb";
String B = "bbbaa";
test.getKMP(A, B);
}
}
运行结果:
开始匹配位置:6
开始匹配位置:12
算法笔记_009:字符串匹配(Java)的更多相关文章
- 算法笔记_136:交替字符串(Java)
目录 1 问题描述 2 解决方案 1 问题描述 输入三个字符串s1.s2和s3,判断第三个字符串s3是否由前两个字符串s1和s2交错而成且不改变s1和s2中各个字符原有的相对顺序. 2 解决方案 ...
- 算法笔记_018:旅行商问题(Java)
目录 1 问题描述 2 解决方案 2.1 蛮力法 2.2 减治法 2.2.1 Johson-Trotter算法 2.2.2 基于字典序的算法 1 问题描述 何为旅行商问题?按照非专业的说法,这个问 ...
- 数据结构与算法之KMP 字符串匹配
举例来说,有一个字符串"DSFFKFJD KFJLKFDLJFJ IWWJKJFJIA",我想知道,里面是否包含另一个字符串"JFJI",有的话就返回在原字符串 ...
- 算法笔记_019:背包问题(Java)
目录 1 问题描述 2 解决方案 2.1 蛮力法 2.2 减治法 2.2.1 递归求解 2.2.2 非递归求解(运用异或运算) 2.3 动态规划法 1 问题描述 给定n个重量为w1,w2,w3,... ...
- 算法笔记_015:快速排序(Java)
目录 1 问题描述 2 解决方案 2.1 快速排序原理简介 2.2 具体编码 1 问题描述 给定一组数据,使用快速排序得到这组数据的非降序排列. 2 解决方案 2.1 快速排序原理简介 引用自百度百科 ...
- 算法模板——KMP字符串匹配
功能:输入一个原串,再输入N个待匹配串,在待匹配串中找出全部原串的起始位置 原理:KMP算法,其实这个东西已经包含了AC自动机的思想(fail指针/数组),只不过适用于单模板匹配,不过值得一提的是在单 ...
- 【sunday算法】玄学字符串匹配
和KMP相似,用于字符串的匹配,貌似平均复杂度比KMP快,也比KMP更好理解. 大概意思是: 如果串b被串a包含,那么串a此时与串b匹配的部分一定一样 所以如果从开头开始匹配到不同处时,在a串找中此时 ...
- 算法笔记_230:运动员分组(Java)
目录 1 问题描述 2 解决方案 1 问题描述 有N个人参加100米短跑比赛.跑道为8条.程序的任务是按照尽量使每组的人数相差最少的原则分组.例如:N=8时,分成1组即可.N=9时,分成2组:一组 ...
- 算法笔记_010:插入排序(Java)
1 问题描述 给定一组数据,使用插入排序得到这组数据的非降序排列. 2 解决方案 2.1 插入排序原理简介 引用自百度百科: 有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求 ...
随机推荐
- POJ1226 Substrings
后缀数组. 求多个字符串翻转与否中最长公共子串长. 二分答案,反过来多建一倍的字符串,二分时特判一下即可. By:大奕哥 #include<cstring> #include<cst ...
- 「TJOI 2018」游园会 Party
「TJOI 2018」游园会 Party 题目描述 小豆参加了 \(NOI\) 的游园会,会场上每完成一个项目就会获得一个奖章,奖章只会是 \(N, O, I\) 的字样. 在会场上他收集到了 \(K ...
- POJ 2378 Tree Cutting 3140 Contestants Division (简单树形dp)
POJ 2378 Tree Cutting:题意 求删除哪些单点后产生的森林中的每一棵树的大小都小于等于原树大小的一半 #include<cstdio> #include<cstri ...
- [待码][BZOJ1858]SCOI2010序列操作 jzyzoj1655
待码的线段树.....太长了看上去不是很想写 [ 什么破理由啊摔,不要脸 ] 嗯先水几道再写
- 执行时间 Exercise07_16
import java.util.Arrays; import java.util.Scanner; /** * @author 冰樱梦 * 时间:2018年下半年 * 题目:执行时间 * */ pu ...
- Codeforces Beta Round #7 A. Kalevitch and Chess 水题
A. Kalevitch and Chess 题目连接: http://www.codeforces.com/contest/7/problem/A Description A famous Berl ...
- mysql存储过程导入表
运用存储过程,把用户表一数据导入用户表二 DELIMITER @@ CREATE PROCEDURE imp_to_user2() BEGIN – 声明一个标志done, 用来判断游标是否遍历完成 D ...
- TortoiseSVN 修改密码
在第一次使用TortoiseSVN从服务器CheckOut的时候,会要求输入用户名和密码,这时输入框下面有个选项是保存认证信息,如果选了这个选项,那么以后就不用每次都输入一遍用户名密码了. 不过,如果 ...
- 搭建MSSM框架(Maven+Spring+Spring MVC+MyBatis)
https://github.com/easonjim/ssm-framework 先欠着,后续再进行讲解: 一.Spring内核集成 二.Spring MVC集成 三.MyBatis集成 四.代码生 ...
- [js插件]学习Highcharts
引言 放了三天假,在家闲着没事,做了一个个人记账的web应用程序,其中一块就是数据统计的功能,也就学习了一下Highcharts. Highcharts Highcharts 是一个用纯JavaScr ...