题解 | #万万没想到之聪明的编辑#
万万没想到之聪明的编辑
https://www.nowcoder.com/practice/42852fd7045c442192fa89404ab42e92
其实就是对连续出现的字符数进行统计的一个问题
假设A字符连续出现了m个,A字符后面紧接的字符B出现了n个
然后就是状态判断了
如果 m > 2,(也就是先判断了 AAA类型,然后再判断AABB类型)
一定输出两个A字符
接下来判断n的个数是否大于1,如果大于1,再输出一个B字符
然后循环的i的结果要挪到连续B字符最后的一个位置
如果不满足上面的任何一种情况,直接输出结果当前循环的字符即可
#include<bits/stdc++.h>
using namespace std;
string getAns(string s)
{
// 优先从到右判断
string ans = "";
int len = s.length();
for(int i = 0; i < len; ++i){
int pre_count = 0;
int last_count = 0;
int mid = i;
int temp = i;
if(mid < len - 1 && s[mid] == s[mid + 1]){
++mid;
pre_count += 1;
while(mid < len && s[mid] == s[i]){
++pre_count;
++mid;
//printf("s[%d] = %c, s[%d] = %c \n",mid,s[mid],i,s[i]);
if( mid < len-1 && s[mid] != s[i] && s[mid] == s[mid+1]){
// 连续的第一个不相同的字符
temp = mid;
last_count = 1;
while(mid < len && s[mid] == s[temp]){
++mid;
++last_count;
}
break;
}
}
ans = ans + s[i] + s[i];
if(last_count > 0){
ans = ans + s[temp];
}
i = mid - 1;
}else{
ans = ans + s[i];
}
}
return ans;
}
signed main(void)
{
int t;
cin>>t;
while(t--)
{
string s;
cin>>s;
if(s.length() < 3){
cout<<s<<endl;
continue;
}
cout<<getAns(s)<<endl;
}
}

