kmp衍生题

题目:
已知一个字符串 向末尾添加字符,使新的字符串包含2个原始子串 ,例如原始串为aba 只需添加一个b即可, 若原始子串为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;
}

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_42673507/article/details/85231824
今日推荐