【习题·字符串】匹配统计(KMP计数)

本博客讲述了如何利用KMP算法解决求解字符串A的后缀子串与字符串B匹配长度为特定值的问题。通过KMP算法,确定每个位置上匹配长度至少为i的子串个数,并通过倒序枚举修正匹配计数,避免重复计算。
摘要由CSDN通过智能技术生成

题目描述

阿轩在纸上写了两个字符串,分别记为A和B。利用在数据结构与算法课上学到的知识,他很容易地求出了“字符串A从任意位置开始的后缀子串”与“字符串B”匹配的长度。

不过阿轩是一个勤学好问的同学,他向你提出了Q个问题:在每个问题中,他给定你一个整数x,请你告诉他有多少个位置,满足“字符串A从该位置开始的后缀子串”与B匹配的长度恰好为x。

例如:A=aabcde,B=ab,则A有aabcde、abcde、bcde、cde、de、e这6个后缀子串,它们与B=ab的匹配长度分别是1、2、0、0、0、0。因此A有4个位置与B的匹配长度恰好为0,有1个位置的匹配长度恰好为1,有1个位置的匹配长度恰好为2。

题解

这道题中我们首先可以想到KMP算法,在KMP算法中对于每一个节点都可以知道匹配了子串的多少位;对于这一个位来说,有可能是刚好长度是这一个,但是更有可能下一位仍然匹配、即长度比这一位还要大;因此我们确定是这一个最大的匹配长度至少有当前这一个匹配的长度。

因此我们就得到了这道题的主要思路:找到长度大小至少为i的匹配个数 c n t [ i ] cnt[i] cnt[i],则对于i的答案一定是 c n t [ i + 1 ] − c n t [ i ] cnt[i+1]-cnt[i] cnt[i+1]cnt[i],即 c n t [ i ] cnt[i] cnt[i]一定包含 c n t [ i +

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值