Sunday算法解决字符串匹配问题
概述
提起字符串匹配可能更多人会想到KMP算法,该算法时间复杂度为O(m+n),而且也是我们在学习数据结构过程中最早接触到的比较好的算法。但KMP算法需要在模式字符串有关联的情况下,也即模式字符串前后缀字符相似度较高的情况下匹配效率比较高。但是在实际应用场景中模式字符串更多情况下是无规律的,因此在工程应用中字符串匹配问题的解决更多的使用的是sunday算法。
解题思路
sunday算法较之于BM算法最大的不同点在于sunday算法在匹配的过程中主串中参加匹配的最末位字符的下一位字符。
- 如果末尾的下一位字符(如该字符为'a')没有在模式字符串中出现过,则直接跳到'a'的下一位字符开始新一轮的比较
- 如果模式字符串中包含'a',则将模式字符串中从左到右中最早出现的字符'a'与源字符串中的'a'对应开始新一轮的匹配
我们下边举一个例子来说明sunday算法的匹配过程。比如在一个主串"substring searching"中查找模式串"search"。
- 开始时,将模式字符串和主字符串左侧对齐开始进行匹配
- 在匹配的过程中发现在第二个字符
e处出现匹配失败的情况。此时我们关注参与匹配的最末尾字符的下一位即i,由于模式字符串中并没有i,因此模式字符串直接跳过一大片,向右移动位数=模式字符串长度+1,也即移动到字符n的位置。
- 在新一轮的匹配过程中发现第一个字符便出现了不匹配的情况。然后我们看到参与匹配的末尾字符的下一位字符为
r,并且r存在于模式字符串中因此可以将模式字符串移动3位(移动到模式字符串中的r和主字符串中的r对齐)如下:
- 在新一轮匹配过程中发现匹配成功,结束匹配返回匹配的位置。
代码
class Solution {
//使用sunday算法来求解
public int strStr(String haystack, String needle) {
//边界判断
if(needle.equals("")||needle==null){
return 0;
}
if(haystack==null){
return -1;
}
char [] haystackArray=haystack.toCharArray();
char []needleArray=needle.toCharArray();
int haystackLength=haystackArray.length;
int needleLength=needleArray.length;
//定义偏移数组
int move[]=new int[256];
//对偏移数组进行初始化工作
for(int i=0;i<256;i++){
move[i]=needleLength+1;
}
for(int i=0;i<needleLength;i++){
move[needleArray[i]]=needleLength-i;
}
//模式字符串第一个字符在匹配过程与源字符串对应的未知,j表示当前已经匹配的字符个数
int s=0,j=0;
//进行匹配
while(s<=haystackLength-needleLength){
j=0;
while(haystackArray[s+j]==needleArray[j]){
j++;
if(j==needleLength){
return s;
}
}
if(s<haystackLength-needleLength){
s+=move[haystackArray[s+needleLength]];
}else{
return -1;
}
}
return -1;
}
}
Sunday算法解决字符串匹配问题的更多相关文章
- KMP算法解决字符串匹配问题
要解决的问题 假设字符串str长度为N,字符串match长度为M,M <= N, 想确定str中是否有某个子串是等于match的.返回和match匹配的字符串的首字母在str的位置,如果不匹配, ...
- 【算法】字符串匹配之Z算法
求文本与单模式串匹配,通常会使用KMP算法.后来接触到了Z算法,感觉Z算法也相当精妙.在以前的博文中也有过用Z算法来解决字符串匹配的题目. 下面介绍一下Z算法. 先一句话讲清楚Z算法能求什么东西. 输 ...
- Java实现 蓝桥杯 算法提高 字符串匹配
试题 算法提高 字符串匹配 问题描述 给出一个字符串和多行文字,在这些文字中找到字符串出现的那些行.你的程序还需支持大小写敏感选项:当选项打开时,表示同一个字母的大写和小写看作不同的字符:当选项关闭时 ...
- C语言之基本算法41—字符串匹配问题
//字符串匹配问题 /* =============================================================== 题目:输入两字符串S,T,输出在S中存在但在T ...
- 经典算法—BF算法(字符串匹配)
前言 字符串的匹配算法也是很经典的一个算法,在面试的时候常常会遇到,而BF算法是字符串模式匹配中的一个简单的算法 1,什么是BF算法 BF算法,即暴力(Brute Force)算法,是普通的模式匹配算 ...
- 【KMP算法】字符串匹配
一.问题 给定两个字符串S(原串)和(模式串)T,找出T在S中出现的位置. 二.朴素算法 当S[i] != T[j]时,把T往后移一位,回溯S的位置并重新开始比较. (1) 成功匹配的部分(AB ...
- Boyer Moore算法(字符串匹配)
上一篇文章,我介绍了KMP算法. 但是,它并不是效率最高的算法,实际采用并不多.各种文本编辑器的"查找"功能(Ctrl+F),大多采用Boyer-Moore算法. Boyer-Mo ...
- 【数据结构与算法】字符串匹配(Rabin-Karp 算法和KMP 算法)
Rabin-Karp 算法 概念 用于在 一个字符串 中查找 另外一个字符串 出现的位置. 与暴力法不同,基本原理就是比较字符串的 哈希码 ( HashCode ) , 快速的确定子字符串是否等于被查 ...
- 字符串匹配常见算法(BF,RK,KMP,BM,Sunday)
今日了解了一下字符串匹配的各种方法. 并对sundaysearch算法实现并且单元. 字符串匹配算法,是在实际工程中经常遇到的问题,也是各大公司笔试面试的常考题目.此算法通常输入为原字符串(strin ...
随机推荐
- java 泛型初理解
泛型方法的定义: 方法1:其中<T extends Comparable<T>> 是用来修饰 List<T>中的T的,意味T必须继承Comparable接口 pu ...
- 《JVM G1源码分析和调优》读书笔记
GC的相关算法与JVM的垃圾收集器 GC的相关算法 分代管理 复制算法 标记清除 标记压缩 JVM垃圾收集器 P242 表11-1 不同类型垃圾回收期比较 串行收集器 Serial. Serial G ...
- html表格、表单
知识点一:表格 1.表格标签 table 2.表格的组成 行 tr 单元格 td 3.建立表格步骤 1.建立表格, 2.判断行数和列数 3.用行去包含单元格 4.在每个单元格中去添加内容 4. ...
- 【算法•日更•第三十期】区间动态规划:洛谷P4170 [CQOI2007]涂色题解
废话不多说,直接上题: P4170 [CQOI2007]涂色 题目描述 假设你有一条长度为5的木版,初始时没有涂过任何颜色.你希望把它的5个单位长度分别涂上红.绿.蓝.绿.红色,用一个长度为5的字符 ...
- 微信小程序自动化测试最佳实践(附 Python 源码)
本文为霍格沃兹测试学院测试大咖公开课<微信小程序自动化测试>图文整理精华版. 随着微信小程序的功能和生态日益完善,很多公司的产品业务形态逐渐从 App 延升到微信小程序.微信公众号等.小程 ...
- PythonCrashCourse 第八章习题
编写一个名为display_message() 的函数,它打印一个句子,指出你在本章学的是什么.调用这个函数,确认显示的消息正确无误 def display_message(): print(&quo ...
- leetcode刷题记录——字符串
242.有效地字母异位词 由于本题的字符串只包含 26 个小写字符,因此可以使用长度为 26 的整型数组对字符串出现的字符进行统计,并对比字母出现的次数是否一致.不再使用 HashMap. toCha ...
- 多线程的指令重排问题:as-if-serial语义,happens-before语义;volatile关键字,volatile和synchronized的区别
一.指令重排问题 你写的代码有可能,根本没有按照你期望的顺序执行,因为编译器和 CPU 会尝试指令重排来让代码运行更高效,这就是指令重排. 1.1 虚拟机层面 我们都知道CPU执行指令的时候,访问内存 ...
- Distributional Reinforcement Learning with Quantile Regression
郑重声明:原文参见标题,如有侵权,请联系作者,将会撤销发布! arXiv:1710.10044v1 [cs.AI] 27 Oct 2017 In AAAI Conference on Artifici ...
- Android中RecyclerView用法,一步一步教你如何使用RecyclerView以及带你走过编码中可能会出现的坑~
首先,要明白RecyclerView是做什么的?其次是为什么要用RecyclerView?这里牵扯到RecyclerView和ListView的区别,这里不废话,大家自行百度即可! 以下示例我用的An ...