数据结构之字符串模式匹配(KMP算法)

一、串的基本操作

在这里插入图片描述

二、串的模式匹配

1、简单的模式匹配算法
在这里插入图片描述

int index(String S,String T){
	int i=1,j=1;
	while(i<=S.length && j<=T.length){
		if(S.ch[i]==T.ch[j]){
			++i;
			++j;
		}
		else{
			i=i-j+2;
			j=1;
		}
	}
	if(j>T.length) return i-T.length;
	else return 0;
}

2、改进的模式匹配算法-----KMP算法
(1)字符串的前后和部分匹配值
以串 ‘ababa’ 为例说明:
在这里插入图片描述
由上可得,字符串‘ababa’的部分匹配值为00123。
部分匹配值的作用:
在这里插入图片描述
在这里插入图片描述
(2)KMP算法
在这里插入图片描述
next求解:
在这里插入图片描述
KMP:
在这里插入图片描述
(3)KMP案例:P=aabaac,T=aabaabaabaac

  1. 求解模式串P的next数组
    a:0
    aa:1
    aab:0
    aaba:1
    aabaa:2
    aabaac:0
    部分匹配值为:

aabaac
010120

然后将部分匹配值向右移动一位,左边添加-1,

a abaac
-101012

然后再分别加一,得到最终的next数组。
在这里插入图片描述

  1. 进行KMP模式匹配
    在这里插入图片描述
    第一趟:此时从 i=0,j=0开始匹配,i=6,j=6时失配,因此 j=next[j],i不变;
    第二趟:此时从 i=6,j=next[j]=3开始匹配,当 i=9,j=6时失配,因此 j=next[j],i不变;
    第三趟:此时从 i=9,j=next[j]=3开始匹配,匹配成功。
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值