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
//今年又是这样没时间来好好看最后的两道算法题。。
#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 ...
随机推荐
- 小菜鸟之java内存结构
JVM启动流程: JVM基本结构图: <深入理解Java虚拟机(第二版)>中的描述是下面这个样子的: Java中的内存分配: Java程序在运行时,需要在内存中的分配空间.为了提高运算效率 ...
- int与Integer的一个小区别
int不能为空,而Integer可以赋空值
- MySQL创表--分页--自关联--
创建表book create table t_book( id int unsigned auto_increment primary key, bookName varchar(255) defau ...
- 移动端、pc端通用点击复制
点击复制 function copyArticle(event){ const range = document.createRange(); range.selectNode(document.ge ...
- python-socketserver实例
import socketserver class MyTCPHandler(socketserver.BaseRequestHandler): def handle(self): while Tru ...
- Codeforces 1194D. 1-2-K Game
传送门 先考虑只能走 $1,2$ 步的情况,设 $p[i]$ 表示当 $n=i$ 时先手是否必胜 自己手玩一下发现 $p$ 就是 $011011011...011$ 这样循环(下标从 $0$ 开始,其 ...
- 9.用ExecuteSqlCommand执行存储过程
比如你有一个存储过程 IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[CreateAutho ...
- json串到java对象
json串到java对象 前端传入参数json字符串,格式如下: {"语文":"88","数学":"78"," ...
- nested exception is org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'enterpriseId' in 'class java.lang.String'
错误信息: nested exception is org.apache.ibatis.reflection.ReflectionException: There is no getter for p ...
- LRU算法介绍和在JAVA的实现及源码分析
一.写随笔的原因:最近准备去朋友公司面试,他说让我看一下LRU算法,就此整理一下,方便以后的复习. 二.具体的内容: 1.简介: LRU是Least Recently Used的缩写,即最近最少使用. ...