KMP算法类习题——字符串匹配
Description
S[i]=S[i+P] for i in [0..SIZE(S)-p-1],
then the prefix is a “period” of S. We want to all the periodic prefixs.
Input
The first line contains an integer T representing the number of cases. Then following T cases.
Each test case contains a string S (1 <= SIZE(S) <= 1000000),represents the title.S consists of lowercase ,uppercase letter.
Output
Sample Input
4
ooo
acmacmacmacmacma
fzufzufzuf
stostootssto
Sample Output
Case #1: 3
1 2 3
Case #2: 6
3 6 9 12 15 16
Case #3: 4
3 6 9 10
Case #4: 2
9 12 参考代码:
#include <cstdio>
#include <cstring>
const int maxn = 1000010;
int p[maxn],ans[maxn];
char str[maxn]; //保存字符串的数组
void get_p(int len){
p[1] = 0;
int j = 0;
for(int i = 2;i <= len;i++){
while(j > 0 && str[j+1] != str[i]) j = p[j];
//这个循环是当结果失配时才使用的
if(str[j+1] == str[i]) j++;
p[i] = j;
}
}
int main(){
int nkase;
scanf("%d",&nkase);
for(int kase = 1;kase <= nkase;kase++){
scanf("%s",str+1);
// 这个+1表示的含义是从下标为1的地方开始输入,方便后续的操作
//像C中这样控制字符串输入的格式还是非常方便的
int len = strlen(str+1);
get_p(len);
//这个是单单初始化了数组p得到了结果,然后主要的思想未知,可能是在求解next数组
//将str的长度告诉函数,通过匹配的方式得到数组p,相当于next数组
int t = p[len],cnt = 0;
while(t){
ans[cnt++] = len-t;
t = p[t];
//每次取到的数值是一定会比以前的要小,所以这不可能是一个死循环的
}
ans[cnt++] = len;
//在这里将所有的运算结果全部保留下来,包括数量cnt和最后输出的结果ans[];
printf("Case #%d: %d\n",kase,cnt);
//在这里有两个参数,即运行的次数和返回的结果数
for(int i = 0;i < cnt-1;i++) printf("%d ",ans[i]);
printf("%d\n",ans[cnt-1]);
}
return 0;
}
关键点分析:
本题还是要先找到next数组,然后通过next数组来访问求解。
当然,每个next数组保存的内容都是不一样的,都是前一个字符匹配得到的信息结果保留在那个地方。
//KMP的算法重点就是求解next数组,当求解next数组时要知道关键点就是next数组中保存的数据是什么意思,那是当失配的时候后缀部分和前面的部分是否相同的表现
KMP算法类习题——字符串匹配的更多相关文章
- 【KMP算法】字符串匹配
一.问题 给定两个字符串S(原串)和(模式串)T,找出T在S中出现的位置. 二.朴素算法 当S[i] != T[j]时,把T往后移一位,回溯S的位置并重新开始比较. (1) 成功匹配的部分(AB ...
- C++编程练习(7)----“KMP模式匹配算法“字符串匹配
子串在主串中的定位操作通常称做串的模式匹配. KMP模式匹配算法实现: /* Index_KMP.h头文件 */ #include<string> #include<sstream& ...
- KMP算法解决字符串匹配问题
要解决的问题 假设字符串str长度为N,字符串match长度为M,M <= N, 想确定str中是否有某个子串是等于match的.返回和match匹配的字符串的首字母在str的位置,如果不匹配, ...
- 字符串匹配KMP算法的C语言实现
字符串匹配是计算机的基本任务之一. 举例来说,有一个字符串"BBC ABCDAB ABCDABCDABDE",我想知道,里面是否包含另一个字符串"ABCDABD" ...
- 字符串匹配常见算法(BF,RK,KMP,BM,Sunday)
今日了解了一下字符串匹配的各种方法. 并对sundaysearch算法实现并且单元. 字符串匹配算法,是在实际工程中经常遇到的问题,也是各大公司笔试面试的常考题目.此算法通常输入为原字符串(strin ...
- 字符串匹配的KMP算法
~~~摘录 来源:阮一峰~~~ 字符串匹配是计算机的基本任务之一. 举例来说,有一个字符串”BBC ABCDAB ABCDABCDABDE”,我想知道,里面是否包含另一个字符串”ABCDABD”? 许 ...
- {Reship}{KMP字符串匹配}
关于KMP字符串匹配的介绍和归纳,作者的思路非常清晰,推荐看一下 http://blog.csdn.net/v_july_v/article/details/7041827
- 字符串匹配的KMP算法详解及C#实现
字符串匹配是计算机的基本任务之一. 举例来说,有一个字符串"BBC ABCDAB ABCDABCDABDE",我想知道,里面是否包含另一个字符串"ABCDABD" ...
- zstu.4194: 字符串匹配(kmp入门题&& 心得)
4194: 字符串匹配 Time Limit: 1 Sec Memory Limit: 128 MB Submit: 206 Solved: 78 Description 给你两个字符串A,B,请 ...
随机推荐
- de4dot 脱壳工具
开源免费的一款工具 官方地址http://www.de4dot.com/ 很NB的工具,能脱大部分的壳 如下 Babel.NET CodeFort CodeVeil CodeWall CryptoOb ...
- 雄冠条码PV系统-2016-05-17-收获
Q1:微信浏览器 input获取焦点时,页面宽度变大 解决方法: HTML <header> 中添加<meta name="viewport" content=& ...
- Chapter 2 Open Book——27
My assessment was confident. 我的评价是很自信的. "Prophase.""Do you mind if I look?" he a ...
- Sass入门:第二章
1.Sass语法格式 假设有这样一段CSS代码: body{ font : 100% Helvetica , sans-serif; color : #333; } Sass最初的语法格式 $font ...
- java web应用程序目录
WEB-INF是用来存储服务端配置文件信息和在服务端运行的类文件的,它下面的东西不允许客户端直接访问的.
- MongoDB数据模型(三)
六.数据模型引用 文档 我们已经知道MongoDB以文档的形式存储数据,而文档是JSON风格的数据结构,由一系列的“字段名-值”对组成,如下所示 { "item": "p ...
- 4、Hibenrate中HQL的10中查询方式
二.具体事例如下: 2.0 编写如下sql语句 )); create sequence seq_teacher; insert into teacher values(seq_teacher.next ...
- IOS 类的属性修饰符atomic
在声明一个类的属性时,默认这个属性会被修饰atomic,意思是原子性访问的. nonatomic和atomic修饰的属性,在自己没有重写setter和getter的时候才会发生作用,其主要的作用可以理 ...
- Openjudge-计算概论(A)-短信计费
描述: 用手机发短信,一条短信资费为0.1元,但限定一条短信的内容在70个字以内(包括70个字).如果你一次所发送的短信超过了70个字,则会按照每70个字一条短信的限制把它分割成多条短信发送.假设已经 ...
- ural 1119. Metro(动态规划)
1119. Metro Time limit: 0.5 second Memory limit: 64 MB Many of SKB Kontur programmers like to get to ...