字符串模式匹配

一、问题

  设有字符串s和pat,长度分别为LengthS和LengthP,在s中查找模式pat。

二、简单方法

  顺序考察s的第i(0<=i<=LengthS-LengthP)个位置,判断是否为一个匹配的起点,若成功,为S设置p指针,pat设置q指针,扫描判断是否匹配。

  时间复杂度O(LengthS*LengthP)。

三、KMP算法

  时间复杂度O(LengthP+LengthS)。

1、基本思想

  设s=s0,s1,...,s(m-1),pat=p0,p1,...p(n-1)

  当前比较si与pj:

  • 如果si==pj,则 i,j 各向前推进一步;
  • 如果si!=pj,        如果 j==0,则 i 向前推进一步,比较si+1与p0;
  •             如果 j>0,则设 y=p0,p1,...,p(j-1),x是y两头匹配的最大真子集,且 x=p0,p1,...,pk,则 p0,p1,..,pk==p(j-k-1),p(j-k-2),...,p(j-1)==s(i-k-1),s(i-k-2),...,s(i-1),可继续比较si与p(k+1)。

2、失败函数

(1)定义

  模式p=p0,p1,...,p(n-1)的失败函数为

  f(j) = 最大的k<j,使得p0,...,pk==p(j-k),...,pj ,     如果这样的k>=0存在的话

-1                                                           ,     否则

(2)实现

  已知f(0)=-1,假设已有 f(i-1),求 f(i)。

  如果 u=v,则 f(j)=f(j-1)+1,否则标记 f1(j)=f(j),fm(f)=f(fm-1(j))

  若 u=w则 f(j)=f2(j-1)+1,否则继续下去,直到找到某个m,使第 fm(j-1)+1个位置的字符与u相等,或者fm(j-1)=-1且第0个位置的字符仍然也不等于u。由此,失败函数的另一种定义形式:

  f(j) = -1          如果 j=0

     fm(j-1)+1      m是使得 p[fk(j-1)+1] = pj 的最小的k

     -1      如果上述k不存在

3、代码

  两个字符串A,B,长度分别为lena和lenb,找到B在A中第一次出现的起始位置。若B未在A中出现,则返回-1。

int findAppearance(string A, int lena, string B, int lenb) {
        // write code here
        int f[10000];
        f[0]=-1;
        for (int j=1;j<lenb;j++){
            int fi=f[j-1];
            while ((B[j]!=B[fi+1]) && (fi>0))
                fi=f[fi];
            if (B[j]==B[fi+1])
                f[j]=fi+1;
            else
                f[j]=-1;
        }

        int i=0, j=0;
        while ((i<lena)&&(j<lenb)){
            if (A[i]==B[j]){
                i++;
                j++;
            }
            else if (j==0)
                i++;
            else
                j=f[j-1]+1;
        }
        if (j<lenb || lenb==0)
            return -1;
        else
            return (i-lenb);
    }
时间: 2024-09-30 22:55:42

字符串模式匹配的相关文章

LeetCode:Word Pattern - 字符串模式匹配

1.题目名称 Word Pattern(字符串模式匹配) 2.题目地址 https://leetcode.com/problems/word-pattern/ 3.题目内容 英文:Given a pattern and a string str, find if str follows the same pattern. 中文:给出一组模式(pattern)和一个字符串(str),查看字符串是否与模式匹配 例如: pattern = "abba",str = "dog cat

字符串模式匹配sunday算法

文字部分转自:http://www.cnblogs.com/mr-ghostaqi/p/4285868.html 代码是我自己写的 今天在做LeetCode的时候,碰到一个写字符串匹配的题目: https://oj.leetcode.com/problems/implement-strstr/ 我一看就懵了,字符串模式匹配我记得当时在上数据结构的时候,书上只写了BF和KMP算法,老师说考试“只可能会考BF”,KMP不要求掌握. 然后出于一颗探求的心,我还是看了一下KMP,这算法好难理解,于是就没

MySQL学习笔记之九 字符串模式匹配

我们在使用查询的时候,经常会碰到模糊条件查询,而模糊查询就涉及到了字符串模式匹配. 在这里,主要讲两个:标准的SQL模式匹配.扩展正则表达式模式匹配.     一.标准的SQL模式匹配 SQL的模式匹配允许你使用"_"匹配任何单个字符,而"%"匹配任意数目字符(包括零个字符).在MySQL中,SQL的模式缺省是忽略大小写的.下面显示一些例子.注意在你 使用SQL模式时,你不能使用=或!=:而使用LIKE或NOT LIKE比较操作符. 为了找出包含正好5个字符的名字,

KMP字符串模式匹配详解

KMP字符串模式匹配通俗点说就是一种在一个字符串中定位另一个串的高效算法.简单匹配算法的时间复杂度为O(m*n);KMP匹配算法.可以证明它的时间复杂度为O(m+n).. 一.简单匹配算法 先来看一个简单匹配算法的函数: int Index_BF ( char S [ ], char T [ ], int pos ) { /* 若串 S 中从第pos(S 的下标0≤pos个字符 起存在和串 T 相同的子串,则称匹配成功,返回第一个 这样的子串在串 S 中的下标,否则返回 -1    */ int

(转)KMP字符串模式匹配详解

(转)KMP字符串模式匹配详解 个人觉得这篇文章是网上的介绍有关KMP算法更让人容易理解的文章了,确实说得很“详细”,耐心地把它看完肯定会有所收获的--,另外有关模式函数值next[i]确实有很多版本啊,在另外一些面向对象的算法描述书中也有失效函数 f(j)的说法,其实是一个意思,即next[j]=f(j-1)+1,不过还是next[j]这种表示法好理解啊: KMP字符串模式匹配详解 KMP字符串模式匹配通俗点说就是一种在一个字符串中定位另一个串的高效算法.简单匹配算法的时间复杂度为O(m*n)

【算法视频】字符串模式匹配--布鲁特.福斯算法

2.4.字符串模式匹配 资讯网址:www.qghkt.com 腾讯课堂:https://qghkt.ke.qq.com/20个常用算法 模式串(或子串)在主串中的定位操作通常称为串的模式匹配,它是各种串处理系统中最重要的运算之一. 2.4.1.布鲁特-福斯算法 [基本思想] 从主串的第一个字符起与模式串的第一个字符比较,若相等,则继续逐个字符进行后续比较,否则从主串的第二个字符起与模式串的第一个字符重新开始比较,直至模式串中每个字符依次与主串中的一个连续的字符序列相等时为止,此时称为匹配成功:如

字符串模式匹配KMP算法中的next数组算法及C++实现

一.问题描述: 对于两个字符串S.T,找到T在S中第一次出现的起始位置,若T未在S中出现,则返回-1. 二.输入描述: 两个字符串S.T. 三.输出描述: 字符串T在S中第一次出现的起始位置,若未出现,则返回-1. 四.输入例子: ababaababcbababc 五.输出例子: 5 六.KMP算法解析: KMP算法分为两步,第一步是计算next数组,第二步是根据next数组通过较节省的方式回溯来比较两个字符串. 网络上不同文章关于next数组的角标含义略有差别,这里取参考文献中王红梅<数据结构

字符串模式匹配之KMP算法图解与 next 数组原理和实现方案

之前说到,朴素的匹配,每趟比较,都要回溯主串的指针,费事.则 KMP 就是对朴素匹配的一种改进.正好复习一下. KMP 算法其改进思想在于: 每当一趟匹配过程中出现字符比较不相等时,不需要回溯主串的 i指针,而是利用已经得到的“部分匹配”的结果将模式子串向右“滑动”尽可能远的一段距离后,继续进行比较.如果 ok,那么主串的指示指针不回溯!算法的时间复杂度只和子串有关!很好. KMP算法的关键是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的,很自然的,需要一个函数来存储匹

13.字符串-模式匹配

一般提起字符串的相关算法,就是几个基本的算法:赋值strcpy.求长strlen.联接strcat.比较strcmp和求子串substr.这5个操作相对来说都比较简单,构成了字符串的最小操作集,其他的算法都可以由这几个算法来实现.但是实际应用中,模式匹配index是应用非常广泛的字符串操作,我们倾向于不依赖其他的操作来实现它. 一般匹配 如下图,在目标字符串S中查找模式字符串T的最直白的做法就是: 1.分别用i.j指向字符串 2.依次遍历,S[i]==T[j]则i++.j++ 3.S[i]!=T

字符串 模式匹配

要点 模式匹配是数据结构中字符串的一种基本运算,给定一个子串,要求在某个字符串中找出与该子串相同的所有子串,这就是模式匹配. 假设P是给定的子串,T是待查找的字符串,要求从T中找出与P相同的所有子串,这个问题成为模式匹配问题.P称为模式,T称为目标.如果T中存在一个或多个模式为P的子串,就给出该子串在T中的位置,称为匹配成功:否则匹配失败. 文中代码是本人自己写的,实测有效,含JAVA和C++两种代码.干货充足吧. 蛮力算法 (BF算法) 蛮力算法(Brute-Force),简称BF算法.(男朋