【PAT】-1112 Stucked Keyboard (20分)-字符串处理

题目描述

1112 Stucked Keyboard (20分)

如果一个键坏了,那么点它一次就会出现连续k个字符。现在给出k和一个字符串,求坏键(按输入的次序)和原本应该输出的字符串(假设坏键没坏的时候)

思路

由于字符顶多有256个,故设置两个bool数组marked[L],printed[L]分别来标志某个键是否为坏键、是否被输出过。
首先初始化所有键都是坏键,所有坏键都未被输出过。
遍历输入数组,当某个键连续出现的次数不是k的整数倍,说明该键一定不是坏键,将marked[i]置为false。
再遍历一次数组输出坏键和原本应该输出的字符串。

#include <bits/stdc++.h>
#define L 256

bool marked[L],showed[L],printed[L];
//某个键是否为坏键、是否出现、是否被输过。
using namespace std;

int main()
{
    int k;
    cin>>k;
    string s;
    cin>>s;
    fill(marked,marked+L,true);
    fill(showed,showed+L,false);
    fill(printed,printed+L,false);

    //遍历得到的坏键和显示的键
    int len=(int)s.length();
    for(int i=0;i<len;)
    {
        int j=i+1;
        int code=s[i];
        while(j<len&&s[j]==s[j-1])j++;
        if((j-i)%k!=0) marked[code]=false;//该键一定不是坏键
        showed[code]=true;//该键出现过
        i=j;
    }
    //边遍历得到结果字符串ans边输出坏键
    string ans;
    for(int i=0;i<len;)
    {
        int code=s[i];
        ans+=code;
        if(marked[code])//是坏键
        {
            i+=k;
            if(!printed[code])//该坏键没被输出过
            {
                cout<<(char)code;
                printed[code]=true;
            }
        }
        else i++;
    }
    cout<<endl;
    cout<<ans;
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值