SDUT OJ 数据结构实验之串一:KMP简单应用 && 浅谈对看毛片算法的理解
数据结构实验之串一:KMP简单应用
Time Limit: 1000 ms Memory Limit: 65536 KiB
Problem Description
给定两个字符串string1和string2,判断string2是否为string1的子串。
Input
输入包含多组数据,每组测试数据包含两行,第一行代表string1(长度小于1000000),第二行代表string2(长度小于1000000),string1和string2中保证不出现空格。
Output
对于每组输入数据,若string2是string1的子串,则输出string2在string1中的位置,若不是,输出-1。
Sample Input
abc
a
123456
45
abc
ddd
Sample Output
1
4
-1
以此为例,浅谈对“看毛片”算法的理解;;
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char s1[1000005],s2[1000005];
int next[1000005];
void get_next(char *s)
{
next[0] = -1; /*next[0]初始化为-1,-1表示不存在相同的最大前缀和最大后缀*/
int k = -1; /*k初始化为-1*/
int len = strlen(s);
for (int i=1; i<=len-1; i++)
{
while (k>-1 && s[k+1] != s[i])
/*如果下一个不同,那么k就变成next[k],
注意next[k]是小于k的,无论k取任何值。*/
k = next[k]; /*往前回溯*/
if (s[k+1] == s[i]) /*如果相同,k++*/
k++;
next[i] = k; /*这个是把算的k的值
(就是相同的最大前缀和最大后缀长)赋给next[i]*/
}
}
int KMP( char *s, char *p )
{
int len1 = strlen(s);
int len2 = strlen(p);
get_next( p ); //计算next数组
int k = -1;
for (int i = 0; i < len1; i++)
{
while (k >-1&& p[k + 1] != s[i])//p和s不匹配,且k>-1(表示p和s有部分匹配)
k = next[k]; //往前回溯
if (p[k + 1] == s[i])
k++;
if (k == len2-1) //说明k移动到p的最末端
//cout << "在位置" << i-len2+1<< endl;
//k = -1;//重新初始化,寻找下一个
//i = i - len2 + 1;//i定位到该位置,外层for循环i++可以继续找下一个(这里默认存在两个匹配字符串可以部分重叠)。
return i - len2 + 2; //返回相应的位置
}
return -1;
}
int main()
{
while( ~scanf("%s", s1) )
{
scanf("%s", s2);
get_next( s2 );
int wz = KMP( s1, s2 );
printf("%d\n", wz );
}
return 0;
}
人如其名, 算法也是这样, 它真是对得起这个名字, 耐得把玩, 经的琢磨。
两句话稍稍说下我的理解吧。
KMP算法的应用于字符串匹配问题,就是比较原串的每一项跟子串的每一项,当遇到不匹配的一项时,原串标的位置不变,子串返回最长公共前后缀长度的下一位,再往后循环看是否匹配。next数组也叫失配数组,为了得到最长公共前后缀长度。
OK, 暂时就这些, 有空再详细理解理解吧。。
SDUT OJ 数据结构实验之串一:KMP简单应用 && 浅谈对看毛片算法的理解的更多相关文章
- SDUT OJ 数据结构实验之串三:KMP应用
数据结构实验之串三:KMP应用 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Problem Descrip ...
- SDUT OJ 数据结构实验之串二:字符串匹配
数据结构实验之串二:字符串匹配 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Problem Descrip ...
- SDUT 3311 数据结构实验之串三:KMP应用
数据结构实验之串三:KMP应用 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 有n个小朋友 ...
- SDUT 2772 数据结构实验之串一:KMP简单应用
数据结构实验之串一:KMP简单应用 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 给定两个 ...
- SDUT OJ 数据结构实验之图论十:判断给定图是否存在合法拓扑序列
数据结构实验之图论十:判断给定图是否存在合法拓扑序列 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Prob ...
- SDUT OJ 数据结构实验之图论八:欧拉回路
数据结构实验之图论八:欧拉回路 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Problem Descrip ...
- SDUT OJ 数据结构实验之图论六:村村通公路(最小生成树)
数据结构实验之图论六:村村通公路 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Problem Descri ...
- SDUT OJ 数据结构实验之图论五:从起始点到目标点的最短步数(BFS)
数据结构实验之图论五:从起始点到目标点的最短步数(BFS) Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss P ...
- SDUT OJ 数据结构实验之图论四:迷宫探索
数据结构实验之图论四:迷宫探索 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Problem Descrip ...
随机推荐
- 【Dubbo学习】
dubbo的介绍 dubbo是一个分布式的开源框架,其核心部分如下: 1.服务提供者:provider 2.服务消费者:consumer 3.注册中心:registry (仅仅只是负责通知) 服务者在 ...
- 浅谈oracle事务
所谓事务,他是一个操作序列,这些操作要么都执行,要么都不执行,是一个不可分割的工作单元.通俗解释就是事务是把很多事情当成一件事情来完成,也就是大家都在一条船上,要死一起死,要活一起活. 为什么要引入事 ...
- js格式化时间和时间操作
js格式化时间 function formatDateTime(inputTime) { var date = new Date(inputTime); var y = date.getFullYea ...
- java Web jsp和servlet的关系
JSP在本质上就是SERVLET,但是两者的创建方式不一样Servlet完全是JAVA程序代码构成,擅长于流程控制和事务处理,通过Servlet来生成动态网页很不直观JSP由HTML代码和JSP标签构 ...
- 仿函数(二、stl中常用仿函数)
提到C++ STL,首先被人想到的是它的三大组件:Containers, Iterators, Algorithms,即容器,迭代器和算法.容器为用户提供了常用的数据结构,算法大多是独立于容器的常用的 ...
- 【bzoj1787】[Ahoi2008]Meet 紧急集合
1787: [Ahoi2008]Meet 紧急集合 Time Limit: 20 Sec Memory Limit: 162 MBSubmit: 2466 Solved: 1117[Submit] ...
- CURL以 POST 请求链接的方式 初始化一个cURL会话来获取一个网页
/** *POST URL */ function posturl($URL,$data) { $ch = curl_init(); // 创建一个新cURL资源 curl_setopt($ch,CU ...
- IWebBrowser和IE浏览器的行为不一样
原本一直以为IWebBrowser2的行为和IE浏览器的行为应该是一样的,但是最近发现事实不是如此. IE8以后的浏览器都带有兼容模式,而IWebBrowser2默认情况下是在兼容模式下运行的,可以参 ...
- Apr编程
一.简介 http://www.xuebuyuan.com/2195578.html 二.教程 http://dev.ariel-networks.com/apr/
- T-SQL解析json字符串函数
T-SQL解析json字符串函数及其使用示例 参考博文:http://www.cnblogs.com/huangtailang/p/4277809.html 1.解析json字符串函数,返回表变量 A ...