aaabbcccee -> aabcce
#include <iostream>
#include <string>
using namespace std;
int main() { int countOfString = 0; cin >> countOfString; while (countOfString--) { string inputStr, outputStr = ""; cin >> inputStr; if (inputStr.length() == 0) { cout << "No String!" << endl; return 0; } // firstRepeat是前面有重复的,secondRepeat是当前离自己最近的有无重复 int firstRepeat = 1, secondRepeat = 0; // 输出串中默认放入第一个 outputStr.push_back(inputStr[0]); // 从输入串中的第一个开始扫,扫一遍即可 for (int i = 1; i < inputStr.length(); i++) { if (inputStr[i] != inputStr[i-1]) { // 当前字符与前一个不同情况: if (firstRepeat == 2) { // 如果前面的字符已经重复了两次 如:aa if (secondRepeat == 0) { // 如果当前的字符还没出现过,当前字符数+1,如aab secondRepeat ++; }else { // 否则,当前的字符作为‘前一个’,如aabc,初始化first和second firstRepeat = 1; secondRepeat = 0; } } }else { // 与前一字符相同的情况: if (secondRepeat != 0) { // 1. aabb secondRepeat ++; }else { // 2. aaa firstRepeat ++; } } // 开始根据first和second给输出赋值 if (firstRepeat == 3) { // aaa情况 firstRepeat --; }else if (secondRepeat == 2) { // aabb情况 firstRepeat = --secondRepeat; secondRepeat = 0; }else { // 满足上述两种情况不输出,否则直接输出 outputStr.push_back(inputStr[i]); } } // 输出 for (int i = 0; i < outputStr.length(); i++) { cout << outputStr[i]; } cout << endl; } return 0; }