版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、数据结构面试之十四字符串的模式匹配题注:面试宝典有相关习题,但思路相对不清晰,排版有错误,作者对此参考相关书籍和自己观点进行了重写,供大家参考。十四、字符串的模式匹配1. 模式匹配定义子串的定位操作称为串的模式匹配。2. 普通字符串匹配BF算法(Brute Force 算法,即蛮力算法)【算法思想】:第(1)步;从主串S的第pos个字符和模式的第一个字符进行比较之,若相等,则继续逐个比较后续字符;否则从主串的下一个字符起再重新和模式串的字符比较之。第(2)步骤;依次类推,直至模式T中的每一个字符依次和主串S中的一个连续的字符序列相等,则称匹配成功;函数值为和模式T中第一个字符相等的字符在主串S
2、中的序号,否则称为匹配不成功,函数值为0。比如对于主串S=”abacababc”; 模式串T=”abab”; 匹配成功,返回4。对于主串S=”abcabcabaac”; 模式串T=”abab”; 匹配不成功,返回0。【算法实现】:/普通字符串匹配算法的实现int Index(char* strS, char* strT, int pos) /返回strT在strS中第pos个字符后出现的位置。 int i = pos; int j = 0; int k = 0; int lens = strlen(strS); int lent = strlen(strT); while(i lens & j
3、 = lent) return i; else return 0; /end算法时间复杂度:设主串长度为m,模式串的长度为n。一般情况下nm。最好时间复杂度:举例,主串S=”ababaababc”; 模式串T=”abab”; 比较次数为n次。时间复杂度为O(n)。最坏时间复杂度:举例,主串S=”(20个0,1个1); 模式串T=”00001”(4个0,1个1);比较次数为17*5次。时间复杂度接近O(m*n)。整个匹配过程需要多次回溯(有16次回溯)。平均时间复杂度:O(m*n)。空间复杂度:O(1),不需要额外开辟空间存储。3. KMP算法是一种线性时间复杂的字符串匹配算法,它是对BF算法改
4、进。时间复杂度:O(m+n),即:O(strlen(S) + strlen(T)空间复杂度:O(n),即:O(strlen(T)【核心思想】:是利用已经得到的部分匹配信息来进行后面的匹配过程。正文tt1t2t3tmtn模式pp1p2p3.pm.【next(j)定义】:表示当pi不等于tr时,下一次将pnexti 与tr开始继续后继对应字符的比较。其中next0=-1,表明当p0不等于tr时,将从p-1与tr开始继续后继对应字符的比较;显然p-1是不存在的,我们可以将这种情况理解成下一步将从p0与tr+1开始继续后继对应字符的比较。举例说明1:模式串p=“google”,对应的nextj=-1,
5、0,0,0,1,0。解读:g设定为-1o字符o之前没有匹配的字符。o字符o(第2个)之前的字符(g,o)不同。g字符g之前的字符(g,o,o)前缀、后缀(如:g与o;go与oo)不匹配。l字符l之前的字符(g,o,o,g)前缀、后缀(如:g与g)相同,返回1。e字符e之前的字符(g,o,o,g,l)前缀、后缀(如:goo与ogl)不同。举例说明2:模式串p=“abaabcaba”,对应的nextj=-1,0,0,1,1,2,0,1,2。【KMP算法实现】:第一步:求解next数组。typedef struct char str100; int length;seqString; /根据模式t的
6、组成求其对应的next数组。void getNext(seqString t, int next) next0 = -1; int i = 0; int j = -1; while(i t.length) if(j = -1 | t.stri = t.strj) +i; +j; nexti = j; else j = nextj; /end while cout next t.length endl; for(i = 0; i t.length; i+) cout nexti t; cout endl;/end第二步:KMP匹配算法的实现。/t代表正文源串,p代表模式匹配串,next代表匹配n
7、ext数组int kmp(seqString t, seqString p, int next) int i = 0; int j = 0; while(i t.length & j t.length) if(j = -1 | t.stri = p.strj) i+; j+; else j = nextj; if(j = p.length) return( i -p.length); else return -1; int main() int rtnPos = 0; seqString strS; strcpy(strS.str,goodgoogle); /源串 strS.length = strlen(strS.str); seqString strT; strcpy(strT.str,abaabcaba); /模式串 strT.length = strlen(strT.str); int *pNext = new intstrT.length; getNext(strT,pNext); rtnPos = kmp(strS,strT,pNext); cout rtnPos endl; /输出匹配位置
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026四川宜宾市第五人民医院医共体总院招聘1人笔试备考试题及答案解析
- 2026年泉州工程职业技术学院单招综合素质笔试参考题库含详细答案解析
- 2026江西赣江新区中医药科创城幼儿园招聘教职员工4人笔试备考试题及答案解析
- 2026年辽宁地质工程职业学院单招综合素质考试备考试题含详细答案解析
- 2026甘肃中医药大学附属医院招聘护理人员12人笔试备考题库及答案解析
- 2026广东广州花都区花东镇莘田小学临聘教师招聘笔试备考试题及答案解析
- 2026南昌市劳动保障事务代理中心派遣制技术运维人员招聘14人笔试备考试题及答案解析
- 2026广东茂名市茂南区农村公路建设项目管理处就业见习人员招聘3人笔试备考试题及答案解析
- 2026年广西科技职业学院单招职业技能考试备考题库含详细答案解析
- 2026安徽黄山徽投集团面向全国部分重点高校引进人才2人笔试备考题库及答案解析
- 2026湖南衡阳日报社招聘事业单位人员16人备考题库附答案详解
- 《中国的地理区域划分》教案-2025-2026学年商务星球版(新教材)初中地理八年级下册
- 2025玉石加工行业创新设计市场竞争与市场发展前景规划
- 2025年天津市检察官、法官入员额考试真题(附答案)
- 建筑施工企业诚信承诺书范本
- 消防改造免责协议书
- GB 3608-2025高处作业分级
- 医疗器械进销存管理台账模板
- 2025年安徽省普通高中学业水平选择性考试地理含答案详解及试卷分析
- DB15∕T 3413-2024 住宅小区和商业用房供配电设施规范
- 2025年滨州邹平市面向社会公开招聘硕博士高层次人才笔试笔试备考试题附答案详解(精练)
评论
0/150
提交评论