第一轮复习完毕,kmp走起

//代码via:http://blog.csdn.net/v_JULY_v/article/details/6111565

//简单思路via:http://study.163.com/course/courseLearn.htm?courseId=468002#/learn/video?lessonId=1024414&courseId=468002

 1 #include<iostream>
 2 #include<string>
 3 #include<vector>
 4 using namespace std;
 5
 6 int kmp_find(const string& target, const string& pattern)
 7 {
 8     const int target_length = target.size();
 9     const int pattern_length = pattern.size();
10     int * overlay_value = new int[pattern_length];
11     overlay_value[0] = -1;
12     int index = 0;
13     for (int i = 1; i<pattern_length; ++i)
14     {
15         index = overlay_value[i - 1];
16         while (index >= 0 && pattern[index + 1] != pattern[i])
17         {
18             index = overlay_value[index];
19         }
20         if (pattern[index + 1] == pattern[i])
21         {
22             overlay_value[i] = index + 1;
23         }
24         else
25         {
26             overlay_value[i] = -1;
27         }
28     }
29     //match algorithm start
30     int pattern_index = 0;
31     int target_index = 0;
32     while (pattern_index<pattern_length&&target_index<target_length)
33     {
34         if (target[target_index] == pattern[pattern_index])
35         {
36             ++target_index;
37             ++pattern_index;
38         }
39         else if (pattern_index == 0)
40         {
41             ++target_index;
42         }
43         else
44         {
45             pattern_index = overlay_value[pattern_index - 1] + 1;
46         }
47     }
48     if (pattern_index == pattern_length)
49     {
50         return target_index - pattern_index;
51     }
52     else
53     {
54         return -1;
55     }
56     delete[] overlay_value;
57 }
58
59 int main()
60 {
61     string source = "ann6bcdanacadsannannabnna";
62     string pattern = "n6bcdan";
63     cout << kmp_find(source, pattern) << endl;
64     return 0;
65 }

相比BF算法(暴力匹配)KMP算法的时间复杂度有所提升,尤其是处理无重复匹配串。

但是我们除了目标串与匹配串还需引入一个数组int next[];存放每次失配位置将回溯(?回那一位继续进行kmp匹配

如何获得next[]数组是一个关键。

代码之前先谈谈思路

1)如果匹配串没有重复,那么一切好说,next[]按脚标顺序即可

2)匹配串有重复的情况,这就是我们要讨论的重点了,下一次从匹配串的哪一位开始与适配位置所在的目标串元素进行比较?

这个位置就是我们next[i]所对应的值

a.

target k m p k k m p m p k
string 0 1 2 3 4 5 6 7 8 9
compare 0 1 2 3 4
string k m p m p
next 0 1 2 3 4
int 0 0 0 2 3
时间: 2024-08-08 09:40:17

第一轮复习完毕,kmp走起的相关文章

[算法第一轮复习] kruskal求最小生成树算法

最小生成树算法即MST,有kruskal,prim两种算法,这里主要介绍kruskal 什么是最小生成树? 对于一个图,保证其中每个点都可以连通的最小的花费 1.算法核心 贪心+并查集 2.算法实现过程 克鲁斯卡尔算法 假设 WN=(V,{E}) 是一个含有 n 个顶点的连通网,则按照克鲁斯卡尔算法构造最小生成树的过程为:先构造一个只含 n 个顶点,而边集为空的子图,若将该子图中各个顶点看成是各棵树上的根结点,则它是一个含有 n 棵树的一个森林.之后,从网的边集 E 中选取一条权值最小的边,若该

[算法第一轮复习] 最短路算法之dijkstra

1.算法描述 dijkstra,一种求单源正权图上的最短路的算法 主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止 Dijkstra算法思想为:设G=(V,E)是一个带权有向图,把图中顶点集合V分成两组,第一组为已求出最短路径的顶点集合(用S表示,初始时S中只有一个源点,以后每求得一条最短路径 , 就将 加入到集合S中,直到全部顶点都加入到S中,算法就结束了),第二组为其余未确定最短路径的顶点集合(用U表示),按最短路径长度的递增次序依次把第二组的顶点加入S中.在加入的过程中,总保持从源

第一轮复习Servlet day04

* 数据的传送接收:后台通过request发送:req.setAttribute("emps", list); req.getRequestDispatcher("emp_list.jsp").forward(req, res); 前端用request接收: List<Emp> list = (List<Emp>)request.getAttribute("emps"); Jsp01: 1.构建maven项目: src/m

高二上学期期末―一轮复习二次(11.9-1.15)

目标:班级第一 继期中考试的一轮一次后,一轮复习二次需要完成的有:(不包括真题试卷) 数学 一年好题刷完一本 圆锥曲线刷完 自招秘籍刷完 浙大一试刷某些薄弱专题 物理 高考必刷题刷完 化学 考点124 53刷完 一年好题刷完 生物 考点13 一年好题刷完 高考必刷题刷完 原文地址:https://www.cnblogs.com/fangshun2002/p/9787909.html

2014年百度之星程序设计大赛 - 初赛(第一轮) hdu Grids (卡特兰数 大数除法取余 扩展gcd)

题目链接 分析:打表以后就能发现时卡特兰数, 但是有除法取余. f[i] = f[i-1]*(4*i - 2)/(i+1); 看了一下网上的题解,照着题解写了下面的代码,不过还是不明白,为什么用扩展gcd, 不是用逆元吗.. 网上还有别人的解释,没看懂,贴一下: (a / b) % m = ( a % (m*b)) / b 笔者注:鉴于ACM题目特别喜欢M=1000000007,为质数: 当gcd(b,m) = 1, 有性质: (a/b)%m = (a*b^-1)%m, 其中b^-1是b模m的逆

第一轮迭代团队贡献分分配

经过我们团队的讨论,第一轮迭代团队贡献的分配方案如下: 团队成员 最终得分 高孟烨 64 邓亚梅 39 陈少杰 62 金鑫 57 雷元勇 36 王迪 37 郑培蕾 55 第一轮迭代的成绩让我们都不是很满意,所以成败就看M2阶段了,小伙伴们加油啦~ 暂定转会的成员是邓亚梅,明天上课的时候最后确定.

ZJOI2017第一轮游记

ZJOI2017第一轮:2017.3.20---3.23 Day 0 有好多天没做作业了,感觉不错. 温州还是不错的,宾馆也很满意. 感觉明天会听不懂. Day1 第一节课的前半部分还能勉强听懂,后面和下午一脸懵逼. 第一节课是有XJ中学的周子鑫学长上的搜索题,下面是一点总结. part 1:折半搜索 比如说双向广搜之类的,主要是从起点和终点交替搜或者是同时搜,可以降低搜索复杂度. 如果答案容易合并,或者搜索的操作可逆,可以考虑折半搜索. 还有一个技巧,要算方案数时,将折半的两边都存入hash数

2014第六届华为编程大赛初赛第一轮

/*********************************************************************** 1.投票问题 输入若干候选人,以及投票,格式如下,输出(按输入候选人输入顺序)候选人以及得票,以及 无效票数. Input: addCandidate xx1 addCandidate xx2 addCandidate xx3 addCandidate xx4 addCandidate xx5 addCandidate xx6 vote xx2 vot

第一轮面试题汇总

1.描述下数据库中的事务--ACID各个的特点 原子性(Atomicity):事务中的操作要么全部成功要么全部失败. 一致性(Consistency):事务前后数据的完整性必须保持一致. 隔离性(Isolation):多个并发的事务之间是相互隔离的,互不干扰的. 持久性(Durability):事务提交后,数据是永久改变的. 2.什么是springboot?你们公司是用的哪个版本? SpringBoot是Spring推出用于解决传统框架配置文件冗余,装配组件繁杂的基于Maven的解决方案,旨在快