串的模式之kmp算法实践题

给定两个由英文字母组成的字符串 String 和 Pattern,要求找到 Pattern 在 String 中第一次出现的位置,并将此位置后的 String 的子串输出。如果找不到,则输出“Not Found”。

本题旨在测试各种不同的匹配算法在各种数据情况下的表现。各组测试数据特点如下:

  • 数据0:小规模字符串,测试基本正确性;
  • 数据1:随机数据,String 长度为 10510^510?5??,Pattern 长度为 101010;
  • 数据2:随机数据,String 长度为 10510^510?5??,Pattern 长度为 10210^210?2??;
  • 数据3:随机数据,String 长度为 10510^510?5??,Pattern 长度为 10310^310?3??;
  • 数据4:随机数据,String 长度为 10510^510?5??,Pattern 长度为 10410^410?4??;
  • 数据5:String 长度为 10610^610?6??,Pattern 长度为 10510^510?5??;测试尾字符不匹配的情形;
  • 数据6:String 长度为 10610^610?6??,Pattern 长度为 10510^510?5??;测试首字符不匹配的情形。

输入格式:

输入第一行给出 String,为由英文字母组成的、长度不超过 10610^610?6?? 的字符串。第二行给出一个正整数 NNN(≤10\le 10≤10),为待匹配的模式串的个数。随后 NNN 行,每行给出一个 Pattern,为由英文字母组成的、长度不超过 10510^510?5?? 的字符串。每个字符串都非空,以回车结束。

输出格式:

对每个 Pattern,按照题面要求输出匹配结果。

输入样例:

abcabcabcabcacabxy
3
abcabcacab
cabcabcd
abcabcabcabcacabxyz

输出样例:

abcabcacabxy
Not Found
Not Found

解题思路:看到这道题无疑就是用kmp算法;下面的代码就是kmp算法的模板?用一个ans记录它是否找到;具体的kmp算法思想在我前面的博客有:链接如下:https://www.cnblogs.com/yewanting/p/10674340.html代码如下:
 1 #include<iostream>
 2 #include<stdio.h>
 3 using namespace std;
 4
 5 int next1[1000005];
 6 void getnext(string t ,int tsize)
 7 {
 8     int k = -1 ;
 9     int j = 0;
10     next1[0] = -1;
11     while(j<tsize-1)
12     {
13         if(k==-1||t[j] == t[k])
14         {
15             ++j;
16             ++k;
17             next1[j] = k;
18         }else
19         k = next1[k];
20
21     }
22 }
23
24 int kmp(string s ,string t ,int ssize,int tsize)
25 {
26     int i = 0 ;
27     int j = 0 ;
28     while(i<ssize&&j<tsize)
29     {
30         if(j==-1||s[i]==t[j])
31         {
32             i++;
33             j++;
34         }else
35         {
36             j = next1[j];
37         }
38     }
39     if(j==tsize)
40     {
41         return i-j+1;
42     }else
43     return -1;
44 }
45 string s ;
46 string t ;
47 int n ;
48 int ssize;
49 int tsize;
50 int ans ;
51 int main()
52 {
53     cin>>s;
54     cin>>n;
55     ssize = s.size();
56     while(n--)
57     {
58         cin>>t;
59         tsize = t.size();
60         getnext(t,tsize);
61         ans = kmp(s,t,ssize,tsize);  //用一个ans来记录是否找到匹配
62         if(ans==-1)   //若找不到
63         {
64             printf("Not Found\n");
65         }else   //找到,则输出后面的字符;
66         {
67             for(int i = ans-1 ;i < ssize; i++)
68             {
69                 cout<<s[i];
70             }
71             cout<<endl;
72         }
73
74     }
75     return 0;
76 }

原文地址:https://www.cnblogs.com/yewanting/p/10706793.html

时间: 2024-08-02 07:47:06

串的模式之kmp算法实践题的相关文章

《数据结构》之串的模式匹配算法——KMP算法

1 //串的模式匹配算法 2 //KMP算法,时间复杂度为O(n+m) 3 #include <iostream> 4 #include <string> 5 #include <cstring> 6 using namespace std; 7 8 //-----串的定长顺序存储结构----- 9 #define MAXLEN 255 //串的最大长度 10 typedef struct { 11 char ch[MAXLEN + 1]; //存储串的一维数组 12

串的模式匹配算法 ------ KMP算法

1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 5 int* get_next(char t[], int length) 6 { 7 int i = 0, j = -1; 8 int* next = (int *)malloc(length * sizeof(int)); 9 next[0] = -1; 10 while (i < length) 11 { 12 if (j =

hdu 1711 KMP算法模板题

题意:给你两个串,问你第二个串是从第一个串的什么位置開始全然匹配的? kmp裸题,复杂度O(n+m). 当一个字符串以0为起始下标时.next[i]能够描写叙述为"不为自身的最大首尾反复子串长度". 当发生失配的情况下,j的新值next[j]取决于模式串中T[0 ~ j-1]中前缀和后缀相等部分的长度, 而且next[j]恰好等于这个最大长度. 防止超时.注意一些细节.. 另外:尽量少用strlen.变量记录下来使用比較好,用字符数组而不用string //KMP算法模板题 //hdu

数据结构例程——串的模式匹配(KMP算法)

本文针对数据结构基础系列网络课程(4):串中第5课时串的模式匹配(KMP算法). 问题:串的模式匹配 KMP算法: #include <stdio.h> #include "sqString.h" void GetNext(SqString t,int next[]) /*由模式串t求出next值*/ { int j,k; j=0; k=-1; next[0]=-1; while (j<t.length-1) { if (k==-1 || t.data[j]==t.d

HDU1711 【kmp算法 基础题】

#include<stdio.h> #include<string.h> int next[10005],lena,lenb; int a[1000005],b[10005]; void set_naxt()//子串的next数组 { int i=0,j=-1; next[0]=-1; while(i<lenb) { if(j==-1||b[i]==b[j]) { i++; j++; next[i]=j; } else j=next[j]; } } int kmp() { i

Java数据结构之字符串模式匹配算法---KMP算法

本文主要的思路都是参考http://kb.cnblogs.com/page/176818/ 如有冒犯请告知,多谢. 一.KMP算法 KMP算法可以在O(n+m)的时间数量级上完成串的模式匹配操作,其基本思想是:每当匹配过程中出现字符串比较不等时,不需回溯指针,而是利用已经得到的"部分匹配"结果将模式向右"滑动"尽可能远的一段距离,继续进行比较.显然我们首先需要获取一个"部分匹配"的结果,该结果怎么计算呢? 二.算法分析 在上一篇中讲到了BF算法,

Java数据结构之字符串模式匹配算法---KMP算法2

直接接上篇上代码: 1 //KMP算法 2 public class KMP { 3 4 // 获取next数组的方法,根据给定的字符串求 5 public static int[] getNext(String sub) { 6 7 int j = 1, k = 0; 8 int[] next = new int[sub.length()]; 9 next[0] = -1; // 这个是规定 10 next[1] = 0; // 这个也是规定 11 // 12 while (j < sub.l

KMP算法实践与简单分析

一.理解next数组 1.约定next[0]=-1,同时可以假想在sub串的最前面有一个通配符"*",能够任意匹配.对应实际的代码t<0时的处理情况. 2.next[j]可以有如下的几种理解思路:1)next[j]为sub[j]前面的字符串的前后缀字符串匹配的最大匹配长度例如sub="ababap"next[5]=3,前后追匹配字符串为"aba"2)在sub[j]位置匹配失败后,next[j]为为sub串的位置指针j能够先前回溯到的位置.3

模式串匹配--KMP算法

  前几天百度LBS部门实习二面,让写一个字符串匹配函数,当时忘记KMP怎么写了,就默默的写了一个暴力搜索,连尝试推导一下KMP都没有,结果自然是没有过,以后面试要多和面试官交流,就算忘记了,也要让他知道你试图推导,要不然他会觉得你可能都没有听过. KMP是对前缀暴力搜索的改进,基于的想法其实是很朴素的.首先我们来看一下暴力搜索. char* BF(char *src, char *pattern){ if(src == NULL || pattern == NULL) return NULL;