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 ...
随机推荐
- RequestParam注解的Url参数被省略时该如何处理
RequestParam注解的Url参数被省略时该如何处理 1.RequestParam的用法 ==================== RequestParam注解可以把包含在Url中的参数映射到U ...
- redis实现发布订阅
订阅者 #!/usr/bin/env python # -*- coding:utf-8 -*- import redis r = redis.Redis(host='192.168.11.119') ...
- key things of ARC
[key things of ARC] 1.使用原则. 2.__weak变量的使用问题 3.__autoreleasing的使用问题 4.block中易造成的强引用环问题. 5.栈变量被初始化为nil ...
- std:: lower_bound std:: upper_bound
std:: lower_bound 该函数返回范围内第一个不小于(大于或等于)指定val的值.如果序列中的值都小于val,则返回last.序列应该已经有序! eg: #include <iost ...
- 如何学习MySQL
转自高手的帖子 1.坚持阅读官方手册,看MySQL书籍作用不会特别大:(挑选跟工作相关的内容优先阅读,例如InnoDB存储引擎,MySQL复制,查询优化) 2.阅读官方手册,同时对阅读的内容做对应的测 ...
- jQuery基础教程-第8章-002Adding jQuery object methods
一.Object method context 1.We have seen that adding global functions requires extending the jQuery ob ...
- 10.IN 操作符
IN 操作符 IN 操作符允许我们在 WHERE 子句中规定多个值. SQL IN 语法 SELECT column_name(s) FROM table_name WHERE column_name ...
- list 的扩展
数据挖掘中会遇到添加多个新的特征s,对一个feature = list()来说, 除了可以用 feature.append('xx') # 在尾部添加一个特征 feature.extend(['xx' ...
- grid search
sklearn.metrics.make_scorer(score_func, greater_is_better=True, needs_proba=False, needs_threshold=F ...
- 使用pycharm运行调试scrapy
摘要 Scrapy是爬虫抓取框架,Pycharm是强大的python的IDE,为了方便使用需要在PyCharm对scrapy程序进行调试 python PyCharm Scrapy scrapy指令其 ...