求给定一个串的nextval

注:nextval[0] = -1

#include<iostream>
using namespace std;

void GetNextval(string &str, int nextval[]){
	nextval[0]=-1;
	int i = 0, j = -1;
	
	while(i < str.size()-1){
		if (j == -1 || str[i] == str[j]){
			++i;
			++j;
			if(str[i]!=str[j]) nextval[i] = j;
			else nextval[i] = nextval[j];
		}
		else j = nextval[j];
	}
}

int main()
{
    string str;
    int nextval[100];
    cin >> str;
    GetNextval(str, nextval);
    for(int i=0;i<str.size();i++){
    	cout<<nextval[i]<<" ";
	}
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
模式"abaabcac"的next数组为: |下标$i$ | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | |:-----:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:| | 字符 | a | b | a | a | b | c | a | c | | next | -1| 0 | 0 | 1 | 1 | 2 | 0 | 1 | next数组的计算方法如下: - 出模式中每个位置的前缀和后缀交集的最大长度,即以该位置为结尾的最长相同前缀和后缀的长度; - 第一个位置的next定义为-1; - 从第二个位置开始,依次计算每个位置的next,计算公式为:$next[i] = k$,其中$k$表示以第$i$个字符为结尾的最长相同前缀和后缀的长度,如果不存在这样的$k$,则令$next[i] = -1$。 对于模式"abaabcac",计算过程如下: - $next[0] = -1$,因为第一个字符没有前缀和后缀; - $next[1] = 0$,因为以第二个字符为结尾的最长相同前缀和后缀的长度为0; - $next[2] = 0$,因为以第三个字符为结尾的最长相同前缀和后缀的长度为0; - $next[3] = 1$,因为以第四个字符为结尾的最长相同前缀和后缀为"a",长度为1; - $next[4] = 1$,因为以第五个字符为结尾的最长相同前缀和后缀为"ab",长度为1; - $next[5] = 2$,因为以第六个字符为结尾的最长相同前缀和后缀为"abc",长度为2; - $next[6] = 0$,因为以第七个字符为结尾的最长相同前缀和后缀的长度为0; - $next[7] = 1$,因为以第八个字符为结尾的最长相同前缀和后缀为"c",长度为1。 因此,模式"abaabcac"的next数组为$[-1, 0, 0, 1, 1, 2, 0, 1]$。 需要注意的是,next数组的计算方法是用于KMP算法中的,而nextval数组是用于BM算法中的,两者的计算方法有所不同。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值