想到两种最简单的方法:
一种是多遍扫,扫到满足条件的字符串为止,复杂度>O(n);
第二种扫一遍,做好充分的标记位,一位一位根据标记位来判断需不需要输出,及时更新标记位,复杂度O(n);代码如下:
测了一下(不知道对不对😂):
aabbccddeeff -> aabccdeef
aabccdddfff -> aabccddf
abbbbbbbbbbbba -> abba

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; }