《数据结构》之串的模式匹配算法——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     int length;    //串的当前长度
13 }SString;
14
15 int Next[MAXLEN + 1];
16 int nextval[MAXLEN + 1];
17
18 int Index_KMP1(SString S, SString T, int pos)
19 {//利用模式串T的Next函数求T在主串S中的第pos个字符之后的位置
20  //其中,T非空,1<=pos<=S.length
21     int i = pos, j = 1;
22     while (i <= S.length && j <= T.length)    //两个串均未比较到串尾
23     {
24         if (j == 0 || S.ch[i] == T.ch[j]) { ++i; ++j; }    //继续比较后继字符
25         else j = Next[j];    //模式串向右移动
26     }
27     if (j > T.length) return i - T.length;    //匹配成功
28     else return 0;    //匹配失败
29 }
30
31 int Index_KMP2(SString S, SString T, int pos)
32 {
33     int i = pos, j = 1;
34     while (i <= S.length && j <= T.length)
35     {
36         if (j == 0 || S.ch[i] == T.ch[j]) { ++i; ++j; }
37         else j = nextval[j];
38     }
39     if (j > T.length) return i - T.length;
40     else return 0;
41 }
42
43 void get_next(SString T, int Next[])
44 {//求模式串T的Next函数值并存入数组Next
45     int i = 1, j = 0;
46     Next[1] = 0;
47     while (i < T.length)
48     {
49         if (j == 0 || T.ch[i] == T.ch[j]) { ++i; ++j; Next[i] = j; }
50         else j = Next[j];
51     }
52 }
53
54 void get_nextval(SString T, int nextval[])
55 {//求模式串T的Next函数修正值并存入数组nextval
56     int i = 1, j = 0;
57     nextval[1] = 0;
58     while (i < T.length)
59     {
60         if (j == 0 || T.ch[i] == T.ch[j])
61         {
62             ++i; ++j;
63             if (T.ch[i] != T.ch[j]) nextval[i] = j;
64             else nextval[i] = nextval[j];
65         }
66         else j = nextval[j];
67     }
68 }
69
70 int main()
71 {
72     SString A, B;
73     A.ch[0] = B.ch[0] = ‘ ‘;
74     while (scanf("%s%s", A.ch + 1, B.ch + 1) == 2)
75     {
76         A.length = strlen(A.ch + 1);
77         B.length = strlen(B.ch + 1);
78         get_next(B, Next);
79         get_nextval(B, nextval);
80         //修正之后匹配更快,结果相同
81         int ans1 = Index_KMP1(A, B, 1), ans2 = Index_KMP2(A, B, 1);
82         printf("%d\t%d\n", ans1, ans2);
83     }
84     return 0;
85 }
时间: 2024-10-05 04:27:44

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

串的模式匹配算法 ------ 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 =

数据结构例程——串的模式匹配(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

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算法实践题

给定两个由英文字母组成的字符串 String 和 Pattern,要求找到 Pattern 在 String 中第一次出现的位置,并将此位置后的 String 的子串输出.如果找不到,则输出“Not Found”. 本题旨在测试各种不同的匹配算法在各种数据情况下的表现.各组测试数据特点如下: 数据0:小规模字符串,测试基本正确性: 数据1:随机数据,String 长度为 10510^510?5??,Pattern 长度为 101010: 数据2:随机数据,String 长度为 10510^510

串、串的模式匹配算法(子串查找)BF算法、KMP算法

串的定长顺序存储#define MAXSTRLEN 255,//超出这个长度则超出部分被舍去,称为截断 串的模式匹配: 串的定义:0个或多个字符组成的有限序列S = 'a1a2a3--.an ' n = 0时为空串串的顺序存储结构:字符数组,串的长度就是数组末尾'\0'前面的字符个数数组需在定义时确定长度,有局限性数组的最大长度二:串的堆分配存储表示typedef struct { char *ch; //若是非空串,则按串长分配存储区 //否则ch为空 int length; //串长度}HS

串的模式匹配算法(BF算法和KMP算法)

串的模式匹配算法 子串的定位操作通常称为串的 模式匹配,其中T称为 模式串. 一般的求子串位置的定位函数(Brute Force) 我写java的代码是这样的 int index(String S,String T,int pos){ char[] s_arr = S.toCharArray(); char[] t_arr = T.toCharArray(); int i,j,k;//i是主串S的指针,j是模式串的指针 if(pos < 0 || pos>S.length() || S.len

24、蛤蟆的数据结构笔记之二十四串的模式匹配算法

24.蛤蟆的数据结构笔记之二十四串的模式匹配算法 本篇名言:"燧石受到的敲打越厉害,发出的光就越灿烂. -- 马克思" 来看下两个算法,BF和KMP算法在串的模式匹配中实现. 欢迎转载,转载请标明出处: 1.  BF算法 BF(Brute Force)算法是普通的模式匹配算法,BF算法的思想就是将目标串S的第一个字符与模式串T的第一个字符进行匹配,若相等,则继续比较S的第二个字符和 T的第二个字符:若不相等,则比较S的第二个字符和T的第一个字符,依次比较下去,直到得出最后的匹配结果.B

第四章:2.串 -- 串的模式匹配算法(KMP)

前言: 目录: 1.串类型的定义 2.串的表示和实现 3.串的模式匹配算法 4.串操作应用举例 正文: 串的模式匹配即,在给定主串S 中,搜索子串T 的位置,如果存在T 则返回其所在位置,否则返回 0 串的模式匹配算法 主串 S: a b c a b c d s v t 子串 T: a b c d 一.原始算法 匹配一旦失败,子串即向右移动一个单位,直到完全匹配停止. 第一次匹配:(注:红色代表不匹配(失配)) S: a b c a b c a b c d s v t   T: a b c d