kmp衍生题 添加字符使字符串包含2个原始子串

题目:
已知一个字符串 向末尾添加字符,使新的字符串包含2个原始子串 ,例如原始串为aba 只需添加一个ba即可, 若原始子串为abc 则需添加abc,若原始子串为aaa,则只需要加一个a即可。

  #include <iostream>
    #include <string>
    #include <vector>
    using namespace std;

//step1:求next数组
vector<int>next_arr(const string &s) {
	//需要记录字符串末尾位置的后一个位置的最大前缀和最大后缀的匹配值 v的大小需要比s的大小大一
	vector<int>v(s.size() + 1);
	//照样v[0] = -1;v[1] = 1;
	v[0] = -1;
	v[1] = 0;
	int cur_pos = 0, i = 2;
	while (i < s.size() + 1) {
		if (s[i - 1] == s[cur_pos])
			v[i++] = ++cur_pos;
		else if (cur_pos>0) {
			cur_pos = v[cur_pos];
		}
		else {
			v[i++] = 0;
		}
	}
	return v;
}
int main()
{
	string str;
	cin >> str;
	vector<int>next = next_arr(str);
	cout << "要添加" << str.substr(next[str.size()], str.size())<<endl;
	cout<<"添加后的字符串为"<<str+ str.substr(next[str.size()], str.size());
	return 0;
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值