KMP 串的模式匹配 (25 分)
给定两个由英文字母组成的字符串 String 和 Pattern,要求找到 Pattern 在 String 中第一次出现的位置,并将此位置后的 String 的子串输出。如果找不到,则输出“Not Found”。
本题旨在测试各种不同的匹配算法在各种数据情况下的表现。各组测试数据特点如下:
- 数据0:小规模字符串,测试基本正确性;
- 数据1:随机数据,String 长度为 1,Pattern 长度为 1;
- 数据2:随机数据,String 长度为 1,Pattern 长度为 1;
- 数据3:随机数据,String 长度为 1,Pattern 长度为 1;
- 数据4:随机数据,String 长度为 1,Pattern 长度为 1;
- 数据5:String 长度为 1,Pattern 长度为 1;测试尾字符不匹配的情形;
- 数据6:String 长度为 1,Pattern 长度为 1;测试首字符不匹配的情形。
输入格式:
输入第一行给出 String,为由英文字母组成的、长度不超过 1 的字符串。第二行给出一个正整数 N(≤),为待匹配的模式串的个数。随后 N 行,每行给出一个 Pattern,为由英文字母组成的、长度不超过 1 的字符串。每个字符串都非空,以回车结束。
输出格式:
对每个 Pattern,按照题面要求输出匹配结果。
输入样例:
abcabcabcabcacabxy
3
abcabcacab
cabcabcd
abcabcabcabcacabxyz
输出样例:
abcabcacabxy
Not Found
Not Found
//慕课网一个小伙伴做出来的。
//11.30没时间做了,网上也找不到这道题的答案,是今年刚出来的新内容
//应该就是最后的输出问题
#include <stdio.h>
#include <string.h>
#include <stdlib.h> typedef int Position;
#define NotFound -1 void BuildMatch( char *pattern, int *match )
{
Position i, j;
int m = strlen(pattern);
match[] = -; for ( j=; j<m; j++ ) {
i = match[j-];
while ( (i>=) && (pattern[i+]!=pattern[j]) )
i = match[i];
if ( pattern[i+]==pattern[j] )
match[j] = i+;
else match[j] = -;
}
} Position KMP( char *string, char *pattern )
{
int n = strlen(string);
int m = strlen(pattern);
Position s, p, *match; if ( n < m ) return NotFound;
match = (Position *)malloc(sizeof(Position) * m);
BuildMatch(pattern, match);
s = p = ;
while ( s<n && p<m ) {
if ( string[s]==pattern[p] ) {
s++; p++;
}
else if (p>) p = match[p-]+;
else s++;
}
return ( p==m )? (s-m) : NotFound;
}
int main() {
char string[] = {};
char pattern[] = {};
scanf("%s\n", (char *)&string);
int n;
scanf("%d", &n);
for(int i=; i<n; i++) {
scanf("%s\n", (char *)&pattern);
Position p = KMP(string, pattern);
if(p != NotFound) {
if(i == n - ) {
printf("%s", (char *)string+p);
} else {
printf("%s\n", (char *)string+p);
}
} else {
if(i == n - ) {
printf("Not Found");
} else {
printf("Not Found\n");
}
}
}
return ;
}
KMP 串的模式匹配 (25 分)的更多相关文章
- KMP 串的模式匹配 (25分)
给定两个由英文字母组成的字符串 String 和 Pattern,要求找到 Pattern 在 String 中第一次出现的位置,并将此位置后的 String 的子串输出.如果找不到,则输出“Not ...
- KMP 串的模式匹配 (25 分)
给定两个由英文字母组成的字符串 String 和 Pattern,要求找到 Pattern 在 String 中第一次出现的位置,并将此位置后的 String 的子串输出.如果找不到,则输出“Not ...
- 浅谈KMP“串”的模式匹配问题
感悟:预处理next[ ]数组求解B串的"自我匹配过程",思路与KMP类似,目标得到最大相同的前缀.后缀. ([1->k]==[i-k+1,i]),可以根据由前往后,利用前面 ...
- 利用KMP算法解决串的模式匹配问题(c++) -- 数据结构
题目: 7-1 串的模式匹配 (30 分) 给定一个主串S(长度<=10^6)和一个模式T(长度<=10^5),要求在主串S中找出与模式T相匹配的子串,返回相匹配的子串中的第一个字符在主串 ...
- KMP 解决串的模式匹配问题
初学KMP的时候,一直不得要领.后来学习AC自动机的时候,一下子明白了KMP实际上是AC自动机的特殊情况. 首先贴三段代码,一组是回溯法,暴力求解,另外两个是KMP串模式匹配 /* 回溯法字符串匹配算 ...
- (原创)数据结构之利用KMP算法解决串的模式匹配问题
给定一个主串S(长度<=10^6)和一个模式T(长度<=10^5),要求在主串S中找出与模式T相匹配的子串,返回相匹配的子串中的第一个字符在主串S中出现的位置. 输入格式: 输入有两行 ...
- PAT 甲级 1024 Palindromic Number (25 分)(大数加法,考虑这个数一开始是不是回文串)
1024 Palindromic Number (25 分) A number that will be the same when it is written forwards or backw ...
- 串的模式匹配,KMP算法
串的模式匹配 现考虑一个常用操作,在字符串s(我们称为主串)中的第pos开始处往后查找,看在主串s中有没有和子串p相匹配的的,如果有,则返回字串p第一次出现的位置. 暴力求解 int Index(ch ...
- PAT 甲级 1040 Longest Symmetric String (25 分)(字符串最长对称字串,遍历)
1040 Longest Symmetric String (25 分) Given a string, you are supposed to output the length of the ...
随机推荐
- BZOJ4976: [Lydsy1708月赛]宝石镶嵌
BZOJ4976: [Lydsy1708月赛]宝石镶嵌 https://lydsy.com/JudgeOnline/problem.php?id=4976 分析: 本来是从\(k\le 100\)这里 ...
- 冷备手工完全恢复(recover database,recover tablespace,recover datafile)
冷备手工完全恢复 1. 手工完全恢复三种级别: recover database: 所有或大部分datafile丢失,一般是在mount状态完成.recover tablespace: 非关 ...
- jquery--find与children方法的区别
children方法: find方法: 通过以上的解释,可以总结如下: 1:children及find方法都用是用来获得element的子elements的,两者都不会返回 text node,就 ...
- 洛谷【P1898】缘分计算
我对模拟的理解:http://www.cnblogs.com/AKMer/p/9064018.html 题目传送门:https://www.luogu.org/problemnew/show/P189 ...
- python中文件打开的各个标识含义
w代表清空后写入 r代表打开后追查 +代表可以写 b代表二进制写入
- POJ1365:素数
Prime Land Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 3552 Accepted: 1609 Descri ...
- app专项测试(稳定性测试、安全性测试)
https://blog.csdn.net/xiaomaoxiao336368/article/details/84887948
- js中的setInterval
跟几个例子吧 计时器的例子: /** * Created by Administrator on 2016/8/5. */ (function () { function show() { var t ...
- Guice 学习
Guice: 是一个轻量级的DI框架. 不需要繁琐的配置,只需要定义一个Module来表述接口和实现类,以及父类和子类之间的关联关系的绑定,如下是一个例子. http://blog.csdn.net/ ...
- spring--设置注入VS构造注入
1.在传统的程序设计中,调用亲自创建被调用者的实例,即由程序控制“对象之间的依赖关系”,这种方式的耦合度比较高:控制反转就是将由程序控制的“对象间的依赖关系”转交给Ioc容器来进行控制,被调用者的实例 ...