今天在做LeetCode的时候,碰到一个写字符串匹配的题目:

https://oj.leetcode.com/problems/implement-strstr/

我一看就懵了,字符串模式匹配我记得当时在上数据结构的时候,书上只写了BF和KMP算法,老师说考试“只可能会考BF”,KMP不要求掌握。

然后出于一颗探求的心,我还是看了一下KMP,这算法好难理解,于是就没记下来。

一看这题就跪了。

上网查了一些算法,好像都对sunday算法很推崇的样子,于是找了好几个看了看,算法思想挺简单的,数学证明我也懒得去了解,毕竟我也不是学数学的料。

算法的基本思想是,模式串和主串从后往前比较,遇到无法匹配的字符的时候,看主串参加匹配的最后一个字符的下一个字符,然后分两种情况:

1、如果该字符没有出现在模式串中,就把模式串向右移动模式串的长度+1个位置。

比如:主串:  ababcdababa

模式串:ababa

到c的位置无法匹配,看c后面的d没有出现在模式串中,则向右移动5+1个位置,结果为:

主串:  ababcdababa

模式串:      ababa

也就是说移动到d后面的一个字符。

2、如果该字符出现在模式串中,则向右移动“该字符在模式串中出现的最右边那次”到字符串末尾的长度+1。

比如:主串:  ababcababa

模式串:ababa

到c的位置无法匹配,看c后面的a出现在模式串中,而模式串中有3个a,我们看最右边那个a,则向右移动0+1个位置,结果为:

主串:  ababcababa

模式串: ababa

具体实现C++的代码如下,匹配成功返回成功的第一个字符的下标,不成功则返回-1:

 1 int strStr(char *haystack, char *needle)
 2 {
 3     int len_h = strlen(haystack);//主串的长度
 4     int len_n = strlen(needle);//模式串的长度
 5     int next[26] = { 0 };//当匹配不成功的时候,模式串向右移动的距离,每个字母对应一个距离
 6     for (int i = 0; i < 26; i++)
 7     {
 8         next[i] = len_n + 1;//默认为模式串的长度+1
 9     }
10     for (int i = 0; i < len_n; i++)
11     {
12         next[needle[i] - 'a'] = len_n - i;//根据每个字符在模式串中的位置修改移动的距离
13     }
14     int index = 0;
15     while (index <= (len_h - len_n))//开始匹配
16     {
17         int i = index;
18         int j;
19         for (j = 0; j < len_n; i++, j++)
20         {
21             if (haystack[i] != needle[j])//如果该次匹配不成功
22             {
23                 if ((index + len_n) >= len_h)//这里的判别是为了防止移动距离过度,导致数组越界
24                     return -1;
25                 index += next[haystack[index + len_n] - 'a'];//根据主串匹配的右边那个字符对应next的数组中的位置,模式串向右移动。
26                 break;
27             }
28         }
29         if (j == len_n)
30         {
31             return index;
32         }
33     }
34     return -1;
35 }

如果代码有什么问题和建议欢迎指出。

转载于:https://www.cnblogs.com/mr-ghostaqi/p/4285868.html

字符串模式匹配sunday算法相关推荐

  1. c++ 字符串匹配算法sunday算法

    sunday 算法是一种很高效的字符串匹配算法, 其实现也较kmp算法简单很多 class Sunday {public:const string& needle;int mp[300];Su ...

  2. 字符串匹配算法(Sunday算法)

    Sunday算法: Sunday算法是Daniel M.Sunday于1990年提出的字符串模式匹配.其核心思想是:在匹配过程中,模式串发现不匹配时,算法能跳过尽可能多的字符以进行下一步的匹配,从而提 ...

  3. 算法笔记:简单的字符串模式匹配-BF算法

    字符串模式匹配是匹配字符串A中是否存在子串a,一般字符串的结尾为'\0',可以以此作为字符串结束的判定标准. 其过程原理图如下所示: 给出源代码: #include<stdio.h> #i ...

  4. PHP 字符串匹配算法 Sunday算法

    搜索文本 text = "my testing algorithm in test" 模式 pattern = "test" Sunday算法的关键点在于 1. ...

  5. 字符串模式匹配KMP算法详解(Python语言)

    问题描述 主串为 ′ababcabcacbab′ ′ a b a b c a b c a c b a b ′ 'ababcabcacbab',模式串为 ′abcac′ ′ a b c a c ′ 'a ...

  6. 算法笔记:简单的字符串模式匹配-KMP算法(与BF算法对比时间复杂度)

    简单的讲就是字符串不回溯. #include<stdio.h> #include<stdlib.h> #include<string.h>int countBF = ...

  7. sunday算法特征码_sunday 算法

    sunday 算法 编辑 锁定 Sunday算法是Daniel M.Sunday于1990年提出的字符串模式匹配.其核心思想是:在匹配过程中,模式串发现不匹配时,算法能跳过尽可能多的字符以进行下一步的 ...

  8. 字符串匹配算法:Sunday算法

    背景 我们第一次接触字符串匹配,想到的肯定是直接用2个循环来遍历,这样代码虽然简单,但时间复杂度却是\(Ω(m*n)\),也就是达到了字符串匹配效率的下限.于是后来人经过研究,构造出了著名的KMP算法 ...

  9. 【算法】Sunday算法(模式匹配)

    #背景 Sunday算法是Daniel M.Sunday于1990年提出的字符串模式匹配.相对比较KMP和BM算法而言,简单了许多. #原理 平均性能的时间复杂度为O(n): 最差情况的时间复杂度为O ...

  10. 【算法视频】字符串模式匹配--布鲁特.福斯算法

    2.4.字符串模式匹配 资讯网址:www.qghkt.com 腾讯课堂:https://qghkt.ke.qq.com/20个常用算法 模式串(或子串)在主串中的定位操作通常称为串的模式匹配,它是各种 ...

最新文章

  1. ligertree内容过多导致崩溃_师傅崩溃了!自身是8年的老师傅,料也没问题,但每次都堵管...
  2. springmvc怎么解析post_秋招跳槽,面试是拦路虎?【spring、springMVC】- 常见面试题汇总...
  3. 多线程小抄集(新编二)
  4. dart系列之:数学什么的就是小意思,看我dart如何玩转它
  5. Android 不显示标题栏和全屏的设置方法
  6. linux用户及权限操作
  7. ORA-14551: 无法在查询中执行 DML 操作
  8. 计算机中乘法是什么函数,c - 分解简单的C函数。 (在64位计算机中为128位乘法) - 堆栈内存溢出...
  9. 小车启动预热是原地预热,还是慢慢开动预热,哪种方式比较好?
  10. ImageView之android:tint= 属性方法作用详解
  11. Delphi10.2下载和安装详解教程(很全的教程)
  12. 那些好用的 GIF 录制工具
  13. python操作微信电脑版_Python通过微信控制电脑
  14. 问卷调查试卷的数据设计
  15. 关于苹果公证(Apple Notarizition)机制的一些总结
  16. 解决 java poi 导出Excel 无法打开问题
  17. Python pandas库|任凭弱水三千,我只取一瓢饮(4)
  18. httpd.conf linux,linux上安装apache以及httpd.conf基本配置
  19. BUUCTF-web极客大挑战
  20. 微信公众号:支付宝支付

热门文章

  1. Android 如何在一个Activity中合理地显示多种类型的checkBox
  2. Java面试题超详细讲解系列之六【网络协议篇】
  3. 导出DataTable数据到Word或者Excel
  4. Linux下rpm安装git
  5. Python selenium报错:selenium.common.exceptions.ElementClickInterceptedException
  6. MySQL 索引最左匹配原则的理解
  7. 27. Minimize casting
  8. 2014清华计算机系直博名单,2014年清华大学外校推免名单.pdf
  9. docker 容器启动顺序_Docker高手进阶 - Docker Compose到底是什么
  10. Vue:vue借助全局过滤器、moment、实现实时更新时间