Week15 实验 - E - CodeForces 1165-C Good String

题目描述:

新式字符串定义如下:

  1. 长度为偶数(可以为空)
  2. 每一个奇数位置的字符都不等于它后面的那个字符

例如,字符串 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;
}

  

posted @ 2020-05-29 17:52  菜鸡今天学习了吗  阅读(146)  评论(0编辑  收藏  举报