串的应用(数组模拟):KMP匹配算法

 1 //////////////////////////////////////////////////////////
 2 // String.cpp
 3 //
 4 // author:Leetao
 5 //////////////////////////////////////////////////////////
 6 // 简介:
 7 //   串的应用(数组模拟):KMP匹配算法
 8 //////////////////////////////////////////////////////////
 9 /**
10 *
11 *
12 * @author Leetao
13 * @version 1.0
14 * @date 2014.11.26
15 */
16 #include<stdio.h>
17 #include<string.h>
18
19 #define MAXSIZE 20
20 int next[MAXSIZE];
21
22 //求模式串t的next函数值并存入数组next中
23 void get_next(char t[],int next[])
24 {
25     int i=1,j=0;
26      next[0]=0;
27
28     while(i<strlen(t))
29     {
30         if(j==0||t[i-1]==t[j-1])
31         {
32             ++i;
33             ++j;
34             next[i-1]=j;
35         }
36         else j=next[j-1];
37     }
38 }
39
40 //KMP算法
41 int Index_KMP(char s[],char t[],int pos)
42 {
43     //利用模式串t的next函数求t在主串s中第pos个字符后的位置
44     int i=pos-1,j=0;
45
46     while(i<strlen(s)&&j<strlen(t))
47     {
48         if(j==0||s[i]==s[j])   //
49         {
50             ++i;
51             ++j;
52         }
53         else j=next[j-1];          //模式串右移
54     }
55
56     if(j>strlen(t)) return (i-strlen(t));   //匹配成功
57     else return 0;
58 }
59
60 int main()
61 {
62     char s[MAXSIZE],t[MAXSIZE];
63     int i,j,n;
64
65     printf("please the one string s:\n");
66         gets(s);
67     printf("please the other string t:\n");
68         gets(t);
69     printf("please enter the starting position:\n");
70         scanf("%d",&n);
71
72      //get_next
73       get_next(t,next);
74
75     if(Index_KMP(s,t,n))
76         {
77             printf("匹配成功,起始位置为%d!\n",Index_KMP(s,t,n));
78
79         }
80     else printf("匹配失败!\n");
81
82     return 0;
83 }
84  

关于KMP算法见另一随笔

时间: 2024-10-04 11:44:07

串的应用(数组模拟):KMP匹配算法的相关文章

数据结构——串的朴素模式和KMP匹配算法

一.朴素模式 假设我们要从主串S="goodgoogle"中找到子串T="google"的位置,步骤如下: i表示主串的当前位置下标,j表示子串的当前位置下标,如上图在第一轮比较(i=1开始)中j=4和i=4的位置不匹配,接下来就要指针回退,从i=2开始比较,如下: 如此反复直到比较到 i =(主串长度-子串长度+1)的位置或者 j = 子串的长度 就退出比较循环,上面的主串和子串在比较到i=5的位置就完全匹配了. #include <stdio.h>

4-4-串的KMP匹配算法-串-第4章-《数据结构》课本源码-严蔚敏吴伟民版

课本源码部分 第4章  串 - KMP匹配算法 ——<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接??? <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明        课本源码合辑  链接??? <数据结构>课本源码合辑        习题集全解析  链接??? <数据结构题集>习题解析合辑        本源码引入的文件  链接? Status.h.SequenceString.c        相关测试数据下载

KMP匹配算法

KMP算法可以在O(n+m)的时间数量上完成串的模式匹配操作. n指的是主字符串的长度,m指的是模式字符串的长度. 求next数组的算法: void get_next(char T[], int next[]) { i = 1; next[1] = 0; j = 0; while( i <= T[0]) { if(j == 0 || T[i] == T[j]) { ++i; ++j; next[i] = j; } else j = next[j]; } } KMP匹配算法: int KMP(ch

【bzoj4974】字符串大师 逆模拟KMP

题目描述 一个串T是S的循环节,当且仅当存在正整数k,使得S是$T^k$(即T重复k次)的前缀,比如abcd是abcdabcdab的循环节.给定一个长度为n的仅由小写字符构成的字符串S,请对于每个k(1<=k<=n),求出S长度为k的前缀的最短循环节的长度$per_i$.字符串大师小Q觉得这个问题过于简单,于是花了一分钟将其AC了,他想检验你是否也是字符串大师. 小Q告诉你n以及$per_1,per_2,...,per_n$,请找到一个长度为n的小写字符串S,使得S能对应上per. 输入 第一

数据结构 算法3.4(栈的应用) 表达式求值(stl版and数组模拟版)

问题是 输入一串表达式 其中包括 数字 和各种运算符(   +,-,*,/,(,) ) 求它的值 如 4+(5+2*7)*3 stl版: #include<iostream> #include<cstdio> #include<cstring> #include<stack> using namespace std; int operate(int a,char op,int b) { if(op=='+') return a+b; if(op=='-')

队列(数组模拟)

//队列(数组模拟) class Queue{ private int[] queue; //队列函数 int length; int head; //头指针 int tail; //尾指针 int num; //丢列中元素个数 public Queue(){ } public Queue(int s){ //构造队列函数 length=s; queue=new int[length]; //s为队列长度 head=0; tail=-1; num=0; } public void inQueue

数组模拟单向链表例题(UVa11988)

指针的链表实现方式是,当前节点的next指向下一个节点,用数组模拟就是 for(int i=next[0];i!=0;i=next[i]) i=next[i]:就是一条链. 例题: 你有一个破损的键盘.键盘上的所有键都可以正常工作,但有时Home键或者End键会自动按下.你并不知道键盘存在这一问题,而是专心打稿子,甚至连显示器都没打开.当你打开显示器时之后,展现在你面前的是一段悲剧文本.你的任务时在打开显示器之前计算出这段悲剧文本. 输入包含多组数据.每组数据占一行,包含不超过100000个字母

UVA11988 Broken Keyboard (a.k.a. Beiju Text)【数组模拟链表】

Broken Keyboard (a.k.a. Beiju Text) You're typing a long text with a broken keyboard. Well it's not so badly broken. The only problem with the keyboard is that sometimes the "home" key or the "end" key gets automatically pressed (inter

Hdu 3887树状数组+模拟栈

题目链接 Counting Offspring Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1757    Accepted Submission(s): 582 Problem Description You are given a tree, it’s root is p, and the node is numbered fr