题目描述:
新式字符串定义如下:
- 长度为偶数(可以为空)
- 每一个奇数位置的字符都不等于它后面的那个字符
例如,字符串 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; }