字符串匹配方法

介绍两种字符串匹配方法

1.暴力匹配

母串用s表示,长度为m

子串用p表示,长度为n

时间复杂度为:(m-n+1)n

算法:从s串的第一个字符开始匹配,若匹配,继续根据p向后匹配,若后续的不匹配,s右移重新匹配p 

2.KMP算法

母串用s表示,长度为m

子串用p表示,长度为n

时间复杂度为:预处理阶段m

算法:①计算next[]数组 ②字符串匹配

【参考】 

 http://kb.cnblogs.com/page/176818/

 http://www.cnblogs.com/gaochundong/p/string_matching.html

 http://blog.csdn.net/v_july_v/article/details/7041827 

【C语言实现】 

 1.暴力匹配

#include <stdio.h>
#include <string.h>
int main()
{
char *s="ASDFZGasdFZGdfasdFZGsdFZGFZG";
char *p="FZG";
int i=0,j=0,count=0;
int len_s=strlen(s);
int len_p=strlen(p);
while(i<len_s&&j<len_p)
{
if (s[i]==p[j])
{
i++;
j++;
else
{
i=i-j+1;
j=0;
}
if (len_p==j)
{ 

printf("%d\n",i-j);//打印匹配成功的起始位置 

count++;//计算匹配次数 
j=0;
}
}
printf("%d\n",count);//打印匹配次数
return 0;
}

 

 2.KMP算法 

#include <stdio.h>
#include <string.h>
int KmpSearch(char* s, char* p, int next[]);
void GetNext(char* p,int next[]);
int main()
{
char *s="asfdafASDdfda";
char *p="SD";
int next[3]={0};
GetNext(p,next);
KmpSearch(s,p,next);
return 0;
}
int KmpSearch(char* s, char* p, int next[])  
{  
int i = 0;  
int j = 0;  
int sLen = strlen(s);  
int pLen = strlen(p);  
while (i < sLen && j < pLen)  
{  
//①如果j = -1,或者当前字符匹配成功(即S[i] == P[j]),都令i++,j++      
if (j == -1 || s[i] == p[j])  
{  
i++;  
j++;  
}  
else  
{  
//②如果j != -1,且当前字符匹配失败(即S[i] != P[j]),则令 i 不变,j = next[j]      
//next[j]即为j所对应的next值        
j = next[j];  
}  
}  
if (j == pLen)
{
printf("%d\n",i-j);//打印匹配成功的起始位置 
return i - j;  
}
else  
return -1;  
void GetNext(char* p,int next[])  //该函数为计算next[]数组,看不太懂。。。算法暂且先记住吧
{  
int pLen = strlen(p);  
next[0] = -1;  //第一位数字置为-1,其余的是最长公共元素右移一位
int k = -1;  
int j = 0;  
while (j < pLen - 1)  
{  
//p[k]表示前缀,p[j]表示后缀  
if (k == -1 || p[j] == p[k])   
{  
++k;  
++j;  
next[j] = k;  
}  
else   
{  
k = next[k];  
}  
}  
}

 

转载于:https://www.cnblogs.com/kinghero/p/5604415.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/374469.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

区分几进制的标志

自己总是记不住进制的开头标记&#xff0c;就写下来忘了就看看 1.二进制&#xff1a;Binary&#xff0c;数字以0b 、0B开头 2.八进制&#xff1a;octal number system&#xff0c;数字自然以0打头 3.十六进制&#xff1a;hexadecimal&#xff0c;以0x、0X开头

每个人都知道MVC…

从一个最近的博客中&#xff0c;您可能已经了解到我最近一直在进行一些采访&#xff0c;因为他们是针对Web应用程序开发人员的&#xff0c;所以我问的一个问题是“您能解释一下MVC模式是什么吗&#xff1f;”&#xff0c;值得称赞的是&#xff0c;每个候选人知道答案。 对于不认…

php无限分类

无限循环 1.需要套2个foreach 2.2个foreach结构一样 纯代码获取数据 public function CycleData($parent_id0){$where[parent_id] $parent_id;$res $this->m->where($where)->field(id,name)->select();foreach($res as $k>$v){$result[$v[id]][id] $v[id];$r…

动态网页数据的采集方案

我在上一篇文章中介绍了使用ScrapySharp快速从网页中采集数据&#xff0c;这种方式是通过直接发送的Http请求来获取的原始页面信息&#xff0c;对于静态网页非常有效&#xff0c;但还有许多网站中的页面内容并非全部存放在原始的页面中&#xff0c;很多内容是通过javascript来动…

r语言ggplot2 多线图绘制图例_plotnine: Python版的ggplot2作图库

腾讯课堂 | Python网络爬虫与文本数据分析同样的基本作图任务&#xff0c;plotnine比matplotlib和seaborn代码量少&#xff0c;更美观。所以我又重新发一遍&#xff0c;大家可以先收藏起来&#xff0c;后面总有用到的时候~R语言的ggplot2绘图能力超强&#xff0c;python虽有mat…

单元和集成测试的代码覆盖率

我最近在一个宠物项目中着手构建自动化的UI&#xff08;集成&#xff09;测试以及普通的单元测试。 我想将所有这些集成到我的Maven构建中&#xff0c;并提供代码覆盖率报告&#xff0c;以便我可以了解测试覆盖率不足的区域。 我不仅发布了项目的源代码&#xff0c;还整理了一个…

javascript事件与event对象的属性

javascript事件列表解说事件浏览器支持解说一般事件onclickIE3、N2鼠标点击时触发此事件ondblclickIE4、N4鼠标双击时触发此事件onmousedownIE4、N4按下鼠标时触发此事件onmouseupIE4、N4鼠标按下后松开鼠标时触发此事件onmouseoverIE3、N2当鼠标移动到某对象范围的上方时触发此…

感想

读完三篇文章看到了前辈们的努力与坚持和对各自的学科的热爱&#xff0c;以及各位前辈的奋斗的艰苦环境&#xff0c;我与那些前辈相比也许还达不到前辈们的那种级别&#xff0c;但是我的学习的条件却比那些前辈们好的多&#xff0c;看完前辈们的奋斗史&#xff0c;以及前辈们的…

python学生分布_Python数据分析实战之分布分析

前言 本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。 作者&#xff1a;严小样儿 分布分析法&#xff0c;一般是根据分析目的&#xff0c;将数据进行分组&#xff0c;研究各组别分布规律的一种分析方法。…

使用Spring Security 3.1保护RESTful Web服务,第3部分

1.概述 本教程显示了如何使用Spring和基于Java的Spring Security 3.1来保护REST服务 。 本文将重点介绍如何使用“登录和Cookie”方法专门针对REST API设置安全配置。 2. Spring Security的体系结构完全基于Servlet过滤器&#xff0c;因此&#xff0c;在HTTP请求处理方面&…

一次完整的HTTP请求所经历的7个步骤

HTTP通信机制是在一次完整的HTTP通信过程中&#xff0c;Web浏览器与Web服务器之间将完成下列7个步骤&#xff1a; 1、建立TCP连接 在HTTP工作开始之前&#xff0c;Web浏览器首先要通过网络与Web服务器建立连接&#xff0c;该连接是通过TCP来完成的&#xff0c;该协议与IP协议共…

jQuery基础--样式篇(3)

1.jQuiery对象与DOM对象   对于刚刚接触jQuery的初学者&#xff0c;我们要清楚认识一点&#xff1a;jQuery对象与DOM对象是不一样的。可能一时半会分不清楚哪些是jQuery对象&#xff0c;哪些是DOM对象&#xff0c;下面重点介绍一下jQuery对象&#xff0c;以及两者相互间的转换…

hls fifo_HLS优化方法DATAFLOW你用了吗

上期内容&#xff1a;异步跨时钟域电路该怎么约束DATAFLOW作为HLS的一种优化方法&#xff0c;对于改善吞吐率(Throughput)、降低延迟(Latency)非常有效。DATAFLOW的作用对象DATAFLOW可以作用于函数&#xff0c;也可以作用于for循环。如下图所示(图片来源Figure62, Figure 63, u…

Java 8虚拟扩展方法

我一直关注Java 8 Lambda表达式项目的发展已经有一段时间了&#xff0c;我对其当前的进展状态感到非常兴奋。 我发现的最新“易于理解”的演示文稿是这样的&#xff1a; http://blogs.oracle.com/briangoetz/resource/devoxx-lang-lib-vm-co-evol.pdf 现在&#xff0c;作为一名…

python爬虫 库_七款必备的Python爬虫库,你知道几个?

很多你需要的信息数据都是在网站内&#xff0c;虽然有些网站的数据会以整洁、结构化的形式呈现&#xff0c;但大部分网站却无法做到这样。因此&#xff0c;当你想要获得一些数据的时候&#xff0c;你需要一些爬虫工具帮助抓取&#xff0c;然后再对其进行分析。今天&#xff0c;…

62个Android Studio小技巧合集

转载&#xff1a; 原文链接&#xff1a;http://laobie.github.io/android/2016/02/14/android-studio-tips.html转载于:https://www.cnblogs.com/kesteler/p/5618490.html

在Hibernate,EhCache,Quartz,DBCP和Spring中启用JMX

继续使用JMX的过程&#xff08;请参阅&#xff1a; 人类JMX &#xff09;&#xff0c;我们将学习如何在一些流行的框架中启用JMX支持&#xff08;通常是统计和监视功能&#xff09;。 这些信息大部分都可以在项目的主页上找到&#xff0c;但是我决定在收集这些信息的同时&#…

二叉树遍历(前中后)

二叉树前序遍历&#xff1a; /*** Definition for binary tree* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*/ class Solution { public:vector<int> preorderTravers…

python语言程序设计实践教程答案实验六_Python程序设计实践教程

书名&#xff1a;Python程序设计实践教程 定价&#xff1a;29.8 ISBN&#xff1a;9787115532602 作者&#xff1a;储岳中 薛希玲 版次&#xff1a;*1版 出版时间&#xff1a;2020-04 内容提要&#xff1a; 本书是Python语言程序设计的配套实践教材&#xff0c;分为三部分&#…

400多万微信用户如何“变现”?凯叔说了五大秘诀与教训

凯叔&#xff0c;原名王凯&#xff0c;自媒体“凯叔讲故事”创始人&#xff0c;近日在狮享家班委会上做了分享&#xff0c;全是实实在在的实验性方法论。以下是王凯的分享内容&#xff0c;整理 / 垅青 我讲的主题叫“基于内容的MVP探索”&#xff0c;MVP是什么东西&#xff1f;…