概述

提起字符串匹配可能更多人会想到KMP算法,该算法时间复杂度为O(m+n),而且也是我们在学习数据结构过程中最早接触到的比较好的算法。但KMP算法需要在模式字符串有关联的情况下,也即模式字符串前后缀字符相似度较高的情况下匹配效率比较高。但是在实际应用场景中模式字符串更多情况下是无规律的,因此在工程应用中字符串匹配问题的解决更多的使用的是sunday算法。

解题思路

sunday算法较之于BM算法最大的不同点在于sunday算法在匹配的过程中主串中参加匹配的最末位字符的下一位字符。

  • 如果末尾的下一位字符(如该字符为'a')没有在模式字符串中出现过,则直接跳到'a'的下一位字符开始新一轮的比较
  • 如果模式字符串中包含'a',则将模式字符串中从左到右中最早出现的字符'a'与源字符串中的'a'对应开始新一轮的匹配

我们下边举一个例子来说明sunday算法的匹配过程。比如在一个主串"substring searching"中查找模式串"search"。

  1. 开始时,将模式字符串和主字符串左侧对齐开始进行匹配

  1. 在匹配的过程中发现在第二个字符e处出现匹配失败的情况。此时我们关注参与匹配的最末尾字符的下一位即i,由于模式字符串中并没有i,因此模式字符串直接跳过一大片,向右移动位数=模式字符串长度+1,也即移动到字符n的位置。

  1. 在新一轮的匹配过程中发现第一个字符便出现了不匹配的情况。然后我们看到参与匹配的末尾字符的下一位字符为r,并且r存在于模式字符串中因此可以将模式字符串移动3位(移动到模式字符串中的r和主字符串中的r对齐)如下:

  1. 在新一轮匹配过程中发现匹配成功,结束匹配返回匹配的位置。

代码

  1. class Solution {
  2. //使用sunday算法来求解
  3. public int strStr(String haystack, String needle) {
  4. //边界判断
  5. if(needle.equals("")||needle==null){
  6. return 0;
  7. }
  8. if(haystack==null){
  9. return -1;
  10. }
  11. char [] haystackArray=haystack.toCharArray();
  12. char []needleArray=needle.toCharArray();
  13. int haystackLength=haystackArray.length;
  14. int needleLength=needleArray.length;
  15. //定义偏移数组
  16. int move[]=new int[256];
  17. //对偏移数组进行初始化工作
  18. for(int i=0;i<256;i++){
  19. move[i]=needleLength+1;
  20. }
  21. for(int i=0;i<needleLength;i++){
  22. move[needleArray[i]]=needleLength-i;
  23. }
  24. //模式字符串第一个字符在匹配过程与源字符串对应的未知,j表示当前已经匹配的字符个数
  25. int s=0,j=0;
  26. //进行匹配
  27. while(s<=haystackLength-needleLength){
  28. j=0;
  29. while(haystackArray[s+j]==needleArray[j]){
  30. j++;
  31. if(j==needleLength){
  32. return s;
  33. }
  34. }
  35. if(s<haystackLength-needleLength){
  36. s+=move[haystackArray[s+needleLength]];
  37. }else{
  38. return -1;
  39. }
  40. }
  41. return -1;
  42. }
  43. }

Sunday算法解决字符串匹配问题的更多相关文章

  1. KMP算法解决字符串匹配问题

    要解决的问题 假设字符串str长度为N,字符串match长度为M,M <= N, 想确定str中是否有某个子串是等于match的.返回和match匹配的字符串的首字母在str的位置,如果不匹配, ...

  2. 【算法】字符串匹配之Z算法

    求文本与单模式串匹配,通常会使用KMP算法.后来接触到了Z算法,感觉Z算法也相当精妙.在以前的博文中也有过用Z算法来解决字符串匹配的题目. 下面介绍一下Z算法. 先一句话讲清楚Z算法能求什么东西. 输 ...

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

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

  4. C语言之基本算法41—字符串匹配问题

    //字符串匹配问题 /* =============================================================== 题目:输入两字符串S,T,输出在S中存在但在T ...

  5. 经典算法—BF算法(字符串匹配)

    前言 字符串的匹配算法也是很经典的一个算法,在面试的时候常常会遇到,而BF算法是字符串模式匹配中的一个简单的算法 1,什么是BF算法 BF算法,即暴力(Brute Force)算法,是普通的模式匹配算 ...

  6. 【KMP算法】字符串匹配

    一.问题 给定两个字符串S(原串)和(模式串)T,找出T在S中出现的位置. 二.朴素算法 当S[i] != T[j]时,把T往后移一位,回溯S的位置并重新开始比较.    (1) 成功匹配的部分(AB ...

  7. Boyer Moore算法(字符串匹配)

    上一篇文章,我介绍了KMP算法. 但是,它并不是效率最高的算法,实际采用并不多.各种文本编辑器的"查找"功能(Ctrl+F),大多采用Boyer-Moore算法. Boyer-Mo ...

  8. 【数据结构与算法】字符串匹配(Rabin-Karp 算法和KMP 算法)

    Rabin-Karp 算法 概念 用于在 一个字符串 中查找 另外一个字符串 出现的位置. 与暴力法不同,基本原理就是比较字符串的 哈希码 ( HashCode ) , 快速的确定子字符串是否等于被查 ...

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

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

随机推荐

  1. 5.深入k8s:StatefulSet控制器

    转载请声明出处哦~,本篇文章发布于luozhiyun的博客:https://www.luozhiyun.com 在上一篇中,讲解了容器持久化存储,从中我们知道什么是PV和PVC,这一篇我们讲通过Sta ...

  2. git使用-标签管理

    1.查看所有的标签 git tag 2.创建标签 git tag  name 3.指定提交标签的信息 git tag -a name -m "comment" 4.删除标签 git ...

  3. 2020-07-05:tcp和udp的区别和应用场景。如何实现断点续传?

    福哥答案2020-07-05: 区别:1.可靠性:tcp可靠.udp不可靠.2.连接性:tcp面向连接.udp无连接.3.报文:tcp字节流.udp面向报文.4.传输效率:tcp低.udp高.5.多点 ...

  4. ElasticSearch 7.X版本19个常用的查询语句

    整理一篇常用的CRUD查询语句,之前这篇文件是在17年左右发表的,从英文翻译过来,现在采用7.x 版本进行实验,弃用的功能或者参数,我这边会进行更新,一起来学习吧. 为了演示不同类型的 Elastic ...

  5. jieba分词的几种形式

    1.精确模式:试图将句子最精确地分开,适合文本分析 seg_list = jieba.cut(test_text, cut_all=False) seg_list = " ".jo ...

  6. MySQL查看正在执行的SQL进程

    查看正在执行的SQL进程: show processlist; 查出来之后, 可以使用下面的命令终止SQL进程: kill ${进程ID}

  7. 图论算法(四)Dijkstra算法

    最短路算法(三)Dijkstra算法 PS:因为这两天忙着写GTMD segment_tree,所以博客可能是seg+图论混搭着来,另外segment_tree的基本知识就懒得整理了-- Part 1 ...

  8. MSDN 无法显示的问题 2010-03-21 21:08

    MSDN 无法显示的问题regsvr32 "C:\Program Files\Common Files\Microsoft Shared\Help\hxds.dll" .试图运行项 ...

  9. 注意STL的小细节 2009-05-18 22:18

    STL分容器,算法,跌代器,配置器,适配器,函数对象等. 容器好学好理解.就是vector,list等,这些是常用的,还有些不常用的deque等.算法可以说是STL的精华了,它的功能强大种类繁多,可根 ...

  10. Docker: docker pull, wget, curl, git clone 等如何更快?

    1) Docker 配置 1.1) daemon.json 配置镜像 路径: /etc/docker/daemon.json 文档: Config Daemon registry-mirrors 设定 ...