题解 | #万万没想到之聪明的编辑#

万万没想到之聪明的编辑

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



#字节面试笔试手撕算法#
全部评论

相关推荐

06-11 17:39
门头沟学院 Java
小呆呆的大鼻涕:卧槽,用户彻底怒了
点赞 评论 收藏
分享
评论
2
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务