数据结构实验之串一:KMP简单应用

Time Limit: 1000 ms Memory Limit: 65536 KiB

Submit Statistic Discuss

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简单应用 && 浅谈对看毛片算法的理解的更多相关文章

  1. SDUT OJ 数据结构实验之串三:KMP应用

    数据结构实验之串三:KMP应用 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Problem Descrip ...

  2. SDUT OJ 数据结构实验之串二:字符串匹配

    数据结构实验之串二:字符串匹配 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Problem Descrip ...

  3. SDUT 3311 数据结构实验之串三:KMP应用

    数据结构实验之串三:KMP应用 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 有n个小朋友 ...

  4. SDUT 2772 数据结构实验之串一:KMP简单应用

    数据结构实验之串一:KMP简单应用 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 给定两个 ...

  5. SDUT OJ 数据结构实验之图论十:判断给定图是否存在合法拓扑序列

    数据结构实验之图论十:判断给定图是否存在合法拓扑序列 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Prob ...

  6. SDUT OJ 数据结构实验之图论八:欧拉回路

    数据结构实验之图论八:欧拉回路 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Problem Descrip ...

  7. SDUT OJ 数据结构实验之图论六:村村通公路(最小生成树)

    数据结构实验之图论六:村村通公路 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Problem Descri ...

  8. SDUT OJ 数据结构实验之图论五:从起始点到目标点的最短步数(BFS)

    数据结构实验之图论五:从起始点到目标点的最短步数(BFS) Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss P ...

  9. SDUT OJ 数据结构实验之图论四:迷宫探索

    数据结构实验之图论四:迷宫探索 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Problem Descrip ...

随机推荐

  1. MySQL备份还原之二使用mysqldump

    1 场景描述: create table gyj_t1(id int,name varchar(10)); insert into gyj_t1 values(1,'AAAAA'); commit; ...

  2. 创建maven工程时报错,解决方案

    解决思路:在本地库中装载maven-archetype-quickstart 1.从 http://mirrors.ibiblio.org/pub/mirrors/maven2/org/apache/ ...

  3. 利用Sphinx编写文档

    利用Sphinx编写文档 1.Sphinx简介和使用理由 ================= Sphinx是一个用Python语言编写而成的文档编写工具.用Sphinx编写文档的时候,用户只需要编写符 ...

  4. 粗粒度(Coarse-grained)vs细粒度(fine-grained)

    在读的一篇文献中关于RDF的描述: As we know, RDF data is a set of triples with the form (subject, property, object) ...

  5. Nginx 下配置Laravel 错误404

    宝塔的访问路径改一下 在站点的配置文件下面server里面加上 location / { try_files $uri $uri/ /index.php?$query_string; } 然后重启Ng ...

  6. Linux常用基本命令 1

    useradd 创建用户. password 修改密码. date 查看时间 man date 帮助文档.f往后翻 b往前翻 q退出.软修改 man hwclock 修改硬件时钟, cal 查看日历 ...

  7. 2014蓝桥杯B组初赛试题《啤酒和饮料》

    题目描述: 啤酒每罐2.3元,饮料每罐1.9元.小明买了若干啤酒和饮料,一共花了82.3元.     我们还知道他买的啤酒比饮料的数量少,请你计算他买了几罐啤酒.     注意:答案是一个整数.请通过 ...

  8. Xcode弱网测试工具

    Network Link Conditioner Network Link Conditioner工具是Mac下提供的一个弱网测试工具. 安装Network Link Conditioner Xcod ...

  9. Jmeter接口测试-获取所有任务API

    获取所有任务 GET /api/tasks 接口获取所有的任务,该接口需要鉴权. 注意,默认情况下鉴权是关闭的.请确保app.coffee中的app.use(express_jwt(secret: j ...

  10. excel中的绝对引用和相对应用

    六.相对引用和绝对引用     1.相对引用   单元格或单元格区域的相对引用是指相对于包含公式的单元格的相对位置.例如,单元格 B2 包含公式 =A1 ;Excel 将在距单元格 B2 上面一个单元 ...