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

Java实现字符串匹配的更多相关文章

  1. java实现字符串匹配问题之求两个字符串的最大公共子串

    转载请注明出处:http://blog.csdn.net/xiaojimanman/article/details/38924981 近期在项目工作中有一个关于文本对照的需求,经过这段时间的学习,总结 ...

  2. 【Java编程】Java中的字符串匹配

    在Java中,字符串的匹配可以使用下面两种方法:         1.使用正则表达式判断字符串匹配         2.使用Pattern类和Matcher类判断字符串匹配 正则表达式的字符串匹配: ...

  3. Java实现 蓝桥杯 算法提高 字符串匹配

    试题 算法提高 字符串匹配 问题描述 给出一个字符串和多行文字,在这些文字中找到字符串出现的那些行.你的程序还需支持大小写敏感选项:当选项打开时,表示同一个字母的大写和小写看作不同的字符:当选项关闭时 ...

  4. Java实现 LeetCode 686 重复叠加字符串匹配

    686. 重复叠加字符串匹配 给定两个字符串 A 和 B, 寻找重复叠加字符串A的最小次数,使得字符串B成为叠加后的字符串A的子串,如果不存在则返回 -1. 举个例子,A = "abcd&q ...

  5. CCF系列之字符串匹配(201409-3)

    试题编号:201409-3试题名称:字符串匹配时间限制: 1.0s内存限制: 256.0MB 问题描述 给出一个字符串和多行文字,在这些文字中找到字符串出现的那些行.你的程序还需支持大小写敏感选项:当 ...

  6. 字符串匹配常见算法(BF,RK,KMP,BM,Sunday)

    今日了解了一下字符串匹配的各种方法. 并对sundaysearch算法实现并且单元. 字符串匹配算法,是在实际工程中经常遇到的问题,也是各大公司笔试面试的常考题目.此算法通常输入为原字符串(strin ...

  7. 【Offer】[19] 【字符串匹配】

    题目描述 思路分析 测试用例 Java代码 代码链接 题目描述 请实现一个函数用来匹配包括'.'和'*'的正则表达式. 模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含 ...

  8. 通用高效字符串匹配--Sunday算法

    字符串匹配(查找)算法是一类重要的字符串算法(String Algorithm).有两个字符串, 长度为m的haystack(查找串)和长度为n的needle(模式串), 它们构造自同一个有限的字母表 ...

  9. LeetCode 942. 增减字符串匹配(DI String Match) 49

    942. 增减字符串匹配 942. DI String Match 题目描述 每日一算法2019/6/21Day 49LeetCode942. DI String Match Java 实现 and ...

随机推荐

  1. [hdu5101]计数问题

    http://acm.hdu.edu.cn/showproblem.php?pid=5101 题目大意:给n个集合,求从两个不同集合里面各取一个数使得它们的和大于给定数的方案数. ans=从所有数里面 ...

  2. python 基础应用4

    1.列表所有元素全部单独输出 #所有元素全部单独输出 li = [1,2,3,'taibai',[4,5,6,'taibaia']] for i in li: if type(i) == list: ...

  3. 更加灵活的参数校验,Spring-boot自定义参数校验注解

    上文我们讨论了如何使用@Min.@Max等注解进行参数校验,主要是针对基本数据类型和级联对象进行参数校验的演示,但是在实际中我们往往需要更为复杂的校验规则,比如注册用户的密码和确认密码进行校验,这个时 ...

  4. ipad4密码忘记锁定了如何破解

    ipad4更新后被要求输入密码,但很长一段时间后忘记了,一直想不起来,也没有忘记密码的选项,以下是简单的破解方法. 注意:没有备份的资料是要被清空的 一.windows10系统,安装iTunes安装 ...

  5. 2018-08-27 jq筛选选择器

    筛选选择器:为了辅助选择器更简便.快速的找到元素: 1.过滤 eq(n) -> 第n个元素(从零开始) $('h1').eq(2) // 第三个h1 first() -> 第一个元素 la ...

  6. (Python基础教程之十三)Python中使用httplib2 – HTTP GET和POST示例

    Python基础教程 在SublimeEditor中配置Python环境 Python代码中添加注释 Python中的变量的使用 Python中的数据类型 Python中的关键字 Python字符串操 ...

  7. app测试、web测试-怎么测?

    app测试 前言 看过许多大神对APP测试的理解,博主总结了一下我们平时测试APP应该注意的一些测试点并结合大神的理解,总结出这篇文章. 一.测试周期 测试周期一般为两周,根据项目情况以及版本质量可适 ...

  8. 12个让您震撼的Linux终端命令

    以下快捷键很有用,可以节省你的时间: CTRL+U: 从光标处删除文本直到行首. CTRL+K: 从光标处删除文本直到行尾. CTRL+Y: 粘贴文本. CTRL+E: 将光标移动到行尾. CTRL+ ...

  9. Java的泛型详解(一)

    Java的泛型详解 泛型的好处 编写的代码可以被不同类型的对象所重用. 因为上面的一个优点,泛型也可以减少代码的编写. 泛型的使用 简单泛型类 public class Pair<T> { ...

  10. Kubernetes学习笔记(二):Pod、标签、注解

    pod与容器 一个pod是一组紧密相关的容器,它们总是一起运行在同一个节点上,以及同一个LInux命名空间中. 每个pod拥有自己的ip,包含若干个容器.pod分布在不同的节点上. 为什么需要pod ...