字符串模式匹配sunday算法
今天在做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算法相关推荐
- c++ 字符串匹配算法sunday算法
sunday 算法是一种很高效的字符串匹配算法, 其实现也较kmp算法简单很多 class Sunday {public:const string& needle;int mp[300];Su ...
- 字符串匹配算法(Sunday算法)
Sunday算法: Sunday算法是Daniel M.Sunday于1990年提出的字符串模式匹配.其核心思想是:在匹配过程中,模式串发现不匹配时,算法能跳过尽可能多的字符以进行下一步的匹配,从而提 ...
- 算法笔记:简单的字符串模式匹配-BF算法
字符串模式匹配是匹配字符串A中是否存在子串a,一般字符串的结尾为'\0',可以以此作为字符串结束的判定标准. 其过程原理图如下所示: 给出源代码: #include<stdio.h> #i ...
- PHP 字符串匹配算法 Sunday算法
搜索文本 text = "my testing algorithm in test" 模式 pattern = "test" Sunday算法的关键点在于 1. ...
- 字符串模式匹配KMP算法详解(Python语言)
问题描述 主串为 ′ababcabcacbab′ ′ a b a b c a b c a c b a b ′ 'ababcabcacbab',模式串为 ′abcac′ ′ a b c a c ′ 'a ...
- 算法笔记:简单的字符串模式匹配-KMP算法(与BF算法对比时间复杂度)
简单的讲就是字符串不回溯. #include<stdio.h> #include<stdlib.h> #include<string.h>int countBF = ...
- sunday算法特征码_sunday 算法
sunday 算法 编辑 锁定 Sunday算法是Daniel M.Sunday于1990年提出的字符串模式匹配.其核心思想是:在匹配过程中,模式串发现不匹配时,算法能跳过尽可能多的字符以进行下一步的 ...
- 字符串匹配算法:Sunday算法
背景 我们第一次接触字符串匹配,想到的肯定是直接用2个循环来遍历,这样代码虽然简单,但时间复杂度却是\(Ω(m*n)\),也就是达到了字符串匹配效率的下限.于是后来人经过研究,构造出了著名的KMP算法 ...
- 【算法】Sunday算法(模式匹配)
#背景 Sunday算法是Daniel M.Sunday于1990年提出的字符串模式匹配.相对比较KMP和BM算法而言,简单了许多. #原理 平均性能的时间复杂度为O(n): 最差情况的时间复杂度为O ...
- 【算法视频】字符串模式匹配--布鲁特.福斯算法
2.4.字符串模式匹配 资讯网址:www.qghkt.com 腾讯课堂:https://qghkt.ke.qq.com/20个常用算法 模式串(或子串)在主串中的定位操作通常称为串的模式匹配,它是各种 ...
最新文章
- ligertree内容过多导致崩溃_师傅崩溃了!自身是8年的老师傅,料也没问题,但每次都堵管...
- springmvc怎么解析post_秋招跳槽,面试是拦路虎?【spring、springMVC】- 常见面试题汇总...
- 多线程小抄集(新编二)
- dart系列之:数学什么的就是小意思,看我dart如何玩转它
- Android 不显示标题栏和全屏的设置方法
- linux用户及权限操作
- ORA-14551: 无法在查询中执行 DML 操作
- 计算机中乘法是什么函数,c - 分解简单的C函数。 (在64位计算机中为128位乘法) - 堆栈内存溢出...
- 小车启动预热是原地预热,还是慢慢开动预热,哪种方式比较好?
- ImageView之android:tint= 属性方法作用详解
- Delphi10.2下载和安装详解教程(很全的教程)
- 那些好用的 GIF 录制工具
- python操作微信电脑版_Python通过微信控制电脑
- 问卷调查试卷的数据设计
- 关于苹果公证(Apple Notarizition)机制的一些总结
- 解决 java poi 导出Excel 无法打开问题
- Python pandas库|任凭弱水三千,我只取一瓢饮(4)
- httpd.conf linux,linux上安装apache以及httpd.conf基本配置
- BUUCTF-web极客大挑战
- 微信公众号:支付宝支付
热门文章
- Android 如何在一个Activity中合理地显示多种类型的checkBox
- Java面试题超详细讲解系列之六【网络协议篇】
- 导出DataTable数据到Word或者Excel
- Linux下rpm安装git
- Python selenium报错:selenium.common.exceptions.ElementClickInterceptedException
- MySQL 索引最左匹配原则的理解
- 27. Minimize casting
- 2014清华计算机系直博名单,2014年清华大学外校推免名单.pdf
- docker 容器启动顺序_Docker高手进阶 - Docker Compose到底是什么
- Vue:vue借助全局过滤器、moment、实现实时更新时间