串的模式匹配

在串的各种操作中,串的模式匹配是经常用到的一个算法。串的模式匹配也称为子串的定位操作,即查找子串在主串中出现的位置。

1.经典的模式匹配算法Brute-Force。

2.KMP算法。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>  

#define MAXSIZE 60  

typedef struct
{
    char ch[MAXSIZE];
    int length;
}SeqString;

#include "SeqString.h"
/*经典的模式匹配算法Brute-Force*/
/*假设串采用顺序存储方式存储,则Brute-Force匹配算法如下*/  

int B_FIndex(SeqString S,int pos,SeqString T)
/*在主串S中的第pos个位置开始查找子串T,如果找到,返回子串在主串中的位置;否则返回-1*/
{
    int i,j;
    i = pos-1;
    j = 0;
    while(i < S.length && j < T.length)
    {
        if(S.ch[i] == T.ch[j])
            /*如果串S和串T中对应的位置的字符相等,则继续比较下一个字符*/
        {
            i++;
            j++;
        }
        else
            /*如果当前对应位置的字符不相等,则从串S的下一个字符开始,从T的第0个字符开始比较*/
        {
            i = i-j+1;
            j = 0;
        }
    }
    if(j >= T.length)
        /*如果在串S中找到串T,则返回子串T在主串S中的位置*/
    {
        return i-j+1;
    }
    else
    {
        return -1;
    }
}  

#include "SeqString.h"
/*KMP算法*/
/*KMP算法思想*/
/*利用模式串T的next函数值求T在主串S中的第pos个字符之间的位置的KMP算法描述如下:*/  

int KMP_Index(SeqString S,int pos,SeqString T,int next[])
{
    int i,j;
    i = pos-1;
    j = 0;
    while(i < S.length && j < T.length)
    {
        if(-1 == j || S.ch[i] == T.ch[j])
            /*如果j=-1或当前字符相等,则继续比较后面的字符*/
        {
            i++;
            j++;
        }
        else/*如果当前字符不相等,则将模式串向右移动*/
        {
            j = next[j];/*数组next保存next函数值*/
        }
    }
    if(j >= T.length)/*匹配成功,则返回子串T在主串S中的位置,否则返回-1*/
    {
        return i-T.length+1;
    }
    else
    {
        return -1;
    }
}  

#include "SeqString.h"
/*KMP算法*/
/*求next函数值*/
/*算法描述如下*/
void GetNext(SeqString T,int next[])
{
    int j,k;
    j = 0;
    k = -1;
    next[0] = -1;
    while(j < T.length)
    {
        if(-1 == k || T.ch[j] == T.ch[k])
        {
            j++;
            k++;
            next[j] = k;
        }
        else
        {
            k = next[k];
        }
    }
}  

#include "SeqString.h"
/*KMP算法*/
/*求next函数值*/
/*改进算法如下*/
void GetNextVal(SeqString T,int nextval[])
{
    int j,k;
    j = 0;
    k = -1;
    nextval[0] = -1;
    while(j < T.length)
    {
        if(-1 == k || T.ch[j] == T.ch[k])
        {
            j++;
            k++;
            if(T.ch[j] != T.ch[k])
            {
                nextval[j] = k;
            }
            else
            {
                nextval[j] = nextval[k];
            }
        }
        else
        {
            k = nextval[k];
        }
    }
}  

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-12-26 11:04:23

串的模式匹配的相关文章

KMP 解决串的模式匹配问题

首先贴三段代码,一组是回溯法,暴力求解,另外两个是KMP串模式匹配 /* 回溯法字符串匹配算法就是用一个循环来找出所有有效位移, 该循环对n-m+1个可能的位移中的每一个index值,检查条件为P[0-m-1]= S[index-index+m-1] (因为模式串的长度是m,索引范围为0-m-1).该算法思维比较简单(但也常被一些公司做为面试题), 很容易分析出本算法的时间复杂度为O(pattern_length*target_length) int search(char const*, in

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

字符串及串的模式匹配

一.串的比较比较的是组成串的字符之间的编码(Unicode.ASCII)二.串的创想数据类型串的逻辑结构和线性表相似,不同之处在于串针对的是字符集对于基本操作,和线性表有区别:1.线性表关注单个元素的操作,比如查找一个元素,插入删除操作2.串更多的是查找子串的位置,得到指定位置的子串,替换子串三.串的存储结构和线性表一样,分为两种:顺序(用一组连续的地址空间).链式存储结构(一个结点存放多个字符的链表) 四.模式匹配:子串的定位操作,通常称为串的模式匹配1.朴素的模式匹配:(不用其他操作<比如字

2016校招真题之串的模式匹配

1.题目描述 对于两个字符串A,B.请设计一个高效算法,找到B在A中第一次出现的起始位置.若B未在A中出现,则返回-1.给定两个字符串A和B,及它们的长度lena和lenb,请返回题目所求的答案. 测试样例: "acbc",4,"bc",2 返回:2 2.代码实现 1 package com.wcy.october; 2 3 /** 4 * 时间:2016年10月16日 5 * 题目:串的模式匹配 6 * 题目描述:对于两个字符串A,B.请设计一个高效算法,找到B在

(原创)数据结构之利用KMP算法解决串的模式匹配问题

给定一个主串S(长度<=10^6)和一个模式T(长度<=10^5),要求在主串S中找出与模式T相匹配的子串,返回相匹配的子串中的第一个字符在主串S中出现的位置. 输入格式: 输入有两行: 第一行是主串S: 第二行是模式T. 输出格式: 输出相匹配的子串中的第一个字符在主串S中出现的位置.若匹配失败,输出0. 输入样例: 在这里给出一组输入.例如: aaaaaba ba 输出样例: 在这里给出相应的输出.例如: 6 解题思路:串的模式匹配有两种:一种是BF算法,一种是KMP算法:基于这道题给的数

第四章学习小结 串的模式匹配 解题心得体会

串的模式匹配 解题心得体会 关于串,模式匹配是其一个很重要的问题.针对这个问题,书上讲了两种模式匹配的算法,即BF算法和KMP算法,下面针对这两种算法的实现谈谈我的心得. 一.BF算法的探索 [错误代码1] #include<iostream> #include<string.h> using namespace std; typedef struct{ char ch[1000002]; int length; }SString; void Index_BF(SString S,

转载 数据结构 串的模式匹配

转载自http://www.cnblogs.com/dolphin0520/ 十分感谢作者大大 KMP算法 KMP算法 在介绍KMP算法之前,先介绍一下BF算法. 一.BF算法 BF算法是普通的模式匹配算法,BF算法的思想就是将目标串S的第一个字符与模式串P的第一个字符进行匹配,若相等,则继续比较S的第二个字符和P的第二个字符:若不相等,则比较S的第二个字符和P的第一个字符,依次比较下去,直到得出最后的匹配结果. 举例说明: S:  ababcababa P:  ababa  BF算法匹配的步骤

数据结构之串及其模式匹配

这里说了些什么? 在这个章节讲了串的结构.构造串的方法.各种对串的操作以及从串的匹配的算法. 串的结构也是千奇百态,有直接按顺序存储的结构,有链条式的存储结构以及基于顺序存储结构和链条结构的合体的名字索引表. 串的操作有点像C++里面有个库叫sctring的操作,函数名字都一样的,然后就是告诉我们是怎么实现的. 模式匹配算法是传统的BF算法(一个一个比失败了就挪动一个位置继续比)和KMP算法(牛皮的跳跃式匹配).关于这个算法我做了一个ppt但是好像不好直接上传,我就上传到了百度云制作了一个链接,

串模式匹配之BF和KMP算法

本文简要谈一下串的模式匹配.主要阐述BF算法和KMP算法.力求讲的清楚又简洁. 一 BF算法 核心思想是:对于主串s和模式串t,长度令为len1,len2,   依次遍历主串s,即第一次从位置0开始len2个字符是否与t对应的字符相等,如果完全相等,匹配成功:否则,从下个位置1开始,再次比较从1开始len2个字符是否与t对应的字符相等.... BF算法思路清晰简单,但是每次匹配不成功时都要回溯. 下面直接贴代码: int BF_Match(char *s, char *t) { int i=0,