H.不要回文
时间限制:2s
描述:
给出一个字符串 S,你需要尽可能少的修改 S 中的字符, 使得 S 不包含长度大于等于 2 的回文子串。
输入
输入的第一行是一个字符串 S, S只包含小写字母
S 的长度大于 5 小于 300
输出
输出使得 S 中不包含长度大于等于 2 的回文, 最少需要修改几个字符 (可以修改成任意字符)
样例输入
abbaa
样例输出
2
解题思路
此题的难点在于:
(1)题目要求不可以出现回文长度大于等于2的回文,即所有相邻的字符都不能相等并且间隔为1的字符也不能相等。
(2)尽可能少的修改S字符串。比如aaba如果修改 第一个字符a,则后面三个还需要修改一次,需要修改两次才满足,但当修改第二个字符a ,只需要一次,所以还需要考虑修改的位置。
具体解法
运用贪心的思想,就是大回文一定包含小回文,所以我们只用判断长为2
和3的回文即可。
小回文类型的讨论分三种情况:
(1)aa且非aaa型:改第二个字符
(2)aba型:改第三个字符
(3)aaa型:改第二、三个字符
代码
#include <iostream>
#include <stdlib.h>
#include <time.h>
using namespace std;
int num = 0;//改变的次数
int main(void)
{
string s;
cin >> s;
srand((int)time(0));
for (int i = 0; i < s.length(); i++)
{
if (s[i] == s[i + 1] && s[i + 1] != s[i + 2])//aa型且非aaa型
{
s[i + 1] = 32 + rand() % 95 ;//随机一个字符替代第二个a
num++;
i++;
}
else if (s[i] == s[i + 1] && s[i + 1] == s[i + 2])//aaa型
{
s[i + 2] = 32 + rand() % 95;//随机字符替代第二个和第三个a
s[i + 1] = 32 + rand() % 95;
num += 2;
i += 2;
}
else if (s[i] == s[i + 2] && s[i] != s[i + 1])//aba型且非aaa型
{
s[i + 2] = 32 + rand() % 95;//随机一个字符替代第三个a
num++;
i += 2;
}
}
cout << num << endl;
return 0;
}
运行结果