PAT甲级 1112 Stucked Keyboard (20 分) 题解

本文详细介绍了一种基于字符串和Map的数据处理方法,通过三个步骤实现:首先,从输入字符串中筛选出所有连续出现k次的字符;其次,对这些字符进行合法性验证,并使用Map去除重复;最后,对原字符串进行遍历,打印出与坏键相关的字符。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述在这里插入图片描述
\quad字符串结合map处理即可。三步走:

  • 1、对于输入字符串s,找出所有连续出现次数达到k次的字符,比如k=3,s=caseee1__thiiis_iiisss_a_teeeeeest时得到temp=eiisee
  • 2、对于temp中每个字符判断是否重复和是否合法,判断是否重复用map记录字符是否出现过即可。判断字符是否合法即为判断当前字符的每次出现是否都是k次,比如temp中字符s就不合法,因为s的出现并非每次都是连续出现3个s,得到res=ei。
  • 3、对于输入的字符串s,逐字符判断是否是坏键所得,打印输出。
#include <iostream>
#include <map>
#include <vector>
using namespace std;

bool isequal(string s)
{
	char temp = s[0];
	for (int i = 1; i < s.length(); ++i){
		if(s[i]!=temp) return false;
	}
	return true;
}
bool isLegal(string s, char t, int k)
{
	for (int i = 0; i < s.length();){
		if(t!=s[i]) i++;
		else{
			string temp = s.substr(i, k);
			if(temp.length()!=k) return false;
			if(!isequal(temp)) return false;
			i += k;
		}
	}
	return true;
}
int main(int argc, char const *argv[])
{
	int k; cin >> k; getchar();
	string s;
	getline(cin, s, '\n');
    string temp = "", res = "";
    map<char, int> mp;
    // 找出所有连续出现次数达到k次的字符,放在temp里面
    for (int i = 0; i < s.length();){
    	string t = s.substr(i, k);
    	if(isequal(t)) temp+=t[0], i+=k;
    	else i++;
    }
    // 对temp里面字符判断合法性并用map去重,将结果放在res里面
    for (int i = 0; i < temp.length(); ++i){
    	if(mp.count(temp[i])==0 && isLegal(s, temp[i], k)) res+=temp[i], mp[temp[i]]=1;
    }
    cout << res << endl;
    int i = 0;
    // 逐字符判断是否是坏键打印所得,输出结果
    while(i<s.length()){
    	cout << s[i];
    	if(mp.count(s[i])==0) i++;
    	else i += k;
    }
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值