字符串模式匹配sunday算法
文字部分转自:http://www.cnblogs.com/mr-ghostaqi/p/4285868.html
代码是我自己写的
今天在做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
#include <iostream>
#include <stdio.h>
#include <string>
#include <string.h>
#include <algorithm>
#include <vector>
#include <map>
#include <stack>
#include <queue>
#include <math.h>
#define maxn 100100
#define N 22000
using namespace std;
int dis[];
char *strStr(char *haystack, char *needle)
{
//haystack 表示母串
// needle 表示子串
int slen = strlen(haystack);
int plen = strlen(needle); int dis[];// 表示当不匹配时跳过的距离 for(int i = ; i < ;i++)
{
dis[i] = plen+;// 初始化为子串长度+1 } for(int i = ; i < plen;i++)
{
dis[needle[i] - 'a'] = plen - i;
} int s = ;
int i = s;
int j = ; while(i < slen&&j < plen)
{
if(haystack[i] == needle[j])
{
i++;
j++;
}
else
{
if(s + plen < slen)// 要判断 s + plen那个一个元素是否存在
{
char c = haystack[s+plen];
s = s + dis[c - 'a'];
i = s;
j = ;
}
else
{
return NULL;
}
}
} if(j == plen)return haystack+s;
else return NULL; }
int main()
{
char* str = "a";
char* p = "a";
char* q = NULL;
q = strStr(str,p); if(q == NULL)puts("NO");
if(q!=NULL)printf("%s\n",q); }
#include <iostream>
#include <stdio.h>
#include <string>
#include <string.h>
#include <algorithm>
#include <vector>
#include <map>
#include <stack>
#include <queue>
#include <math.h>
#define maxn 100100
#define N 22000
using namespace std;
int dis[];
//返回出现的第一个位置,否则返回NULL
char *sunday(char *haystack, char *needle)
{
//haystack 表示母串
// needle 表示子串
int slen = strlen(haystack);
int plen = strlen(needle); int dis[];// 表示当不匹配时跳过的距离 for(int i = ; i < ;i++)
{
dis[i] = plen+;// 初始化为子串长度+1 }
for(int i = ; i < plen;i++)
{
dis[needle[i] - 'a'] = plen - i;
} int s = ;
int i = s;
int j = ;
while(i < slen&&j < plen)
{
if(haystack[i] == needle[j])
{
i++;
j++;
}
else
{
if(s + plen < slen)// 要判断 s + plen那个一个元素是否存在
{
char c = haystack[s+plen];
s = s + dis[c - 'a'];
i = s;
j = ;
}
else
{
return NULL;
}
}
} if(j == plen)return haystack+s;
else return NULL;
}
int main()
{
char* str = "ababcdababa";
char* p = "ababa";
char* q = NULL;
q = strStr(str,p); if(q == NULL)puts("NO");
if(q!=NULL)printf("%s\n",q); }
字符串模式匹配sunday算法的更多相关文章
- 字符串模式匹配KMP算法
一篇不错的博客:http://www.cnblogs.com/dolphin0520/archive/2011/08/24/2151846.html KMP字符串模式匹配通俗点说就是一种在一个字符串中 ...
- 字符串模式匹配——KMP算法
KMP算法匹配字符串 朴素匹配算法 字符串的模式匹配的方法刚开始是朴素匹配算法,也就是经常说的暴力匹配,说白了就是用子串去和父串一个一个匹配,从父串的第一个字符开始匹配,如果匹配到某一个失配了,就 ...
- 数据结构4.3_字符串模式匹配——KMP算法详解
next数组表示字符串前后缀匹配的最大长度.是KMP算法的精髓所在.可以起到决定模式字符串右移多少长度以达到跳跃式匹配的高效模式. 以下是对next数组的解释: 如何求next数组: 相关链接:按顺序 ...
- Sunday算法:字符串匹配算法进阶
背景 我们第一次接触字符串匹配,想到的肯定是直接用2个循环来遍历,这样代码虽然简单,但时间复杂度却是\(Ω(m*n)\),也就是达到了字符串匹配效率的下限.于是后来人经过研究,构造出了著名的KMP算法 ...
- 字符串匹配算法:Sunday算法
背景 我们第一次接触字符串匹配,想到的肯定是直接用2个循环来遍历,这样代码虽然简单,但时间复杂度却是\(Ω(m*n)\),也就是达到了字符串匹配效率的下限.于是后来人经过研究,构造出了著名的KMP算法 ...
- Sunday算法(字符串查找、匹配)
字符串查找算法中,最著名的两个是KMP算法(Knuth-Morris-Pratt)和BM算法(Boyer-Moore).两个算法在最坏情况下均具有线性的查找时间.但是在实用上,KMP算法并不比最简单的 ...
- 字符串匹配算法之Sunday算法
字符串匹配查找算法中,最着名的两个是KMP算法(Knuth-Morris-Pratt)和BM算法(Boyer-Moore).两个算法在最坏情况下均具有线性的查找时间.但是在实用上,KMP算法并不比最简 ...
- 字符串查找算法总结(暴力匹配、KMP 算法、Boyer-Moore 算法和 Sunday 算法)
字符串匹配是字符串的一种基本操作:给定一个长度为 M 的文本和一个长度为 N 的模式串,在文本中找到一个和该模式相符的子字符串,并返回该字字符串在文本中的位置. KMP 算法,全称是 Knuth-Mo ...
- 字符串匹配算法之Sunday算法(转)
字符串匹配算法之Sunday算法 背景 我们第一次接触字符串匹配,想到的肯定是直接用2个循环来遍历,这样代码虽然简单,但时间复杂度却是Ω(m*n),也就是达到了字符串匹配效率的下限.于是后来人经过研究 ...
随机推荐
- matlab实现高斯消去法、LU分解
朴素高斯消去法: function x = GauElim(n, A, b) if nargin < 2 for i = 1 : 1 : n for j = 1 : 1 : n A(i, j) ...
- aspnet_regiis.exe 的用法
使用aspnet_regiis.exe注册.NET Framework 重新安装IIS以后,需要用aspnet_regiis.exe来注册.NET Framework, 如下: C:\WINDOWS\ ...
- C# testJsonAsXMLNodeAttribute - XML& json & Collections - XmlNode, XmlElement, XmlAttribute,Dictionary,List
testJsonAsXMLNodeAttribute using Newtonsoft.Json; using System; using System.Collections.Generic; us ...
- ORA-01031:insufficient privileges
描述:oracle11g用scott用户在plsql上以sysdba身份登录显示以上错误,可是在cmd面板中却正常,网上各种找答案不没有对症,最后这位网友的回答解决了我的问题. 原帖网址:http:/ ...
- 使用Div+CSS布局设计网站的优点
网页设计业界越来越关注DIV+CSS的标准化设计,大到各大门户网站,小到不计其数的个人网站,在Div+CSS标准化的影响下,网页设计人员已经把这一要求作为行业标准.那么什么是Div+CSS标准?Div ...
- pos机套现是怎么回事
POS机是商家为了促进消费,向银行申请的刷卡机它的主要功能是转账就是通过客户的刷卡,把相对的金额转入商户的帐户银行会根据笔数或金额向商户收取手续费非法套现就是客户并未和商户产生贸易往来,单纯通过pos ...
- Java基于Socket文件传输示例(转)
最近需要进行网络传输大文件,于是对基于socket的文件传输作了一个初步的了解.在一位网友提供的程序基础上,俺进行了一些加工,采用了缓冲输入/输出流来包装输出流,再采用数据输入/输出输出流进行包装,加 ...
- hdu 1056
水题 ~~ 按题目要求直接判断~. /************************************************************************* > A ...
- 翻译:用Javascript的Function构造器伪造上下文 by Ben Nadel
在我的jQuery模板标记语言(JTML)项目中,我需要一种方式将JTML模板编译到JS函数,这样它们就可以如期地在任何时候转换成新的HTML标记.但这是一个严峻的问题,因为JTML代码涉及非作用域( ...
- cvc-elt.1: Cannot find the declaration of element---与spring 无关的schema 验证失败
晚上查了好久,都是spring 出这种问题的解决方式,终于查到为什么了. http://wakan.blog.51cto.com/59583/7218/ 转自这个人.. 多谢啦! 为了验证 XML 文 ...