Week15 实验 - E - CodeForces 1165-C Good String
题目描述:
新式字符串定义如下:
- 长度为偶数(可以为空)
- 每一个奇数位置的字符都不等于它后面的那个字符
例如,字符串 good、string、xyyx 都符合要求,而字符串 bad、aa、aabc 则不符合。
现在你获得了一个字符串 S,你需要从该字符串中删除最少的字符数,使其变成一个新式字符串。
输出删除了多少个字符和最后的新式字符串。
思路:
- 从前往后处理是可以的,因为如果先处理后面的,则前面的一样要处理
- 两个连续的字符,删除哪一个也是无所谓的
- 只在奇数位置考虑,如果当前奇数位置是连续的aa,删除一个a,下一个a变成奇数位置继续判断
- 如果当前奇数位置不是连续的,直接加2,跳到下一个奇数位
- 考虑这种算法的特殊情况:N=1时,没有两个能比较的字符,结果是空串;N=2时,如果连续,则删除一个之后,剩下的一个没有可以比较的字符,是空串;N=2时,如果不连续,则就是这两个字符;N>=3时,属于一般情况
代码:
借鉴了用户”mrning“的代码
//从前往后处理是可以的,因为如果先处理后面的,则前面的一样要处理
//两个连续的字符,删除哪一个也是无所谓的
//只在奇数位置考虑,如果当前奇数位置是连续的aa,删除一个a,下一个a变成奇数位置继续判断
//如果当前奇数位置不是连续的,直接加2,跳到下一个奇数位
#include <cstdio>
#include <iostream>
#include <string>
using namespace std;
const int MAXN = 2e5 + 5;
string s;
string ans;
int main()
{
int N, K = 0;
cin >> N >> s;
int i = 0;
while (i < N-1)
{
if (s[i] == s[i + 1])
++i;
else
{
ans += s[i];
ans += s[i + 1];
i = i + 2;
}
}
cout << N - ans.size() << endl;
cout << ans << endl;
return 0;
}

浙公网安备 33010602011771号