栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

KMP——字符串匹配算法

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

KMP——字符串匹配算法

KMP算法挺抽象,第一次接触理解不够深,以后通过题目慢慢了解。

设字符串a长度为n,待匹配子串b的长度为m,暴力枚举法的时间复杂度为log(m*n)
而KMP算法的时间复杂度为log(m+n),因为指向主串i只增不减,避免了多余的回溯。

算法内容:
首先构造一个数组P
P[i]存储的是b串前i个字符前缀和后缀相同的最大字符个数
例如b=“ababa”,则p={0,0,1,2,3}
然后是匹配过程,例如:

若让b向右移动一格是没必要的,利用已经预处理好的数组p可以让b向右移动一个前缀的距离,只需j=p[j],而p[5]为3,即从i== 5,j== 3开始匹配,如下图

一道例题(HOJ):剪花布条

#include
using namespace std;
char b[1005],a[1005];

int kmp(char a[],char b[]){//a和b都是从下表为1开始存储!!
    int res=0,j=0,m=strlen(b+1),n=strlen(a+1),p[1005]={0};
    for(int i=1;i0&&b[j+1]!=b[i+1])j=p[j];
            if(b[i+1]==b[j+1])j++;
            p[i+1]=j;
        }
        j=0;
        for(int i=0;i0&&b[j+1]!=a[i+1])j=p[j];
            if(b[j+1]==a[i+1])j++;
            if(j==m){
                //cout<>a+1){
        if(a[1]=='#')break;
        cin>>b+1;
        cout<
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/290563.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号