题解 | #万万没想到之聪明的编辑#
万万没想到之聪明的编辑
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; } }