【笔记】codeforces 1099C-Postcard(#530 div2 C题)用到的c++ string函数与STL方法

文章介绍了一种解码由?和*编码的字符串的方法,通过C++STLstring库进行操作。根据给定的整数k,判断并操作字符串以达到指定长度,讨论了不同长度情况下如何进行删除、保留或重复字符。涉及到的关键函数包括string.length()、count()、insert()、erase()和replace()。
摘要由CSDN通过智能技术生成

原题Problem - C - Codeforces

大致题意:给定一个用'?'和'*'编码的字符串,其中包含有小写英文字符及'?'和'*'两种字符,这两种字符必定跟在一个英文字符后面。现对其进行解码。可进行的操作如下:

         若一个字符后跟着 '?' ,则该字符可被删除留下

         若一个字符后跟着 '*' ,则该字符可被删除留下重复无数次

现给出一个不超过200的整数k,要求解码后的字符串(仅含小写英文字母)长度为k。若能解码,则输出一种答案;若不能,则输出"Impossible"。

例如:

        hw?ap*yn?eww*ye*ar
        12

则可解为:happynewyear

当然,hapynewwyear、hwaynewwyear等也是正确答案。

思路

将给定的字符串的长度(不统计'?'与'*')len与给定的k进行比较。如果len<k,说明原串中有字符需要重复,那么将某个*前的字符重复(k-len)次,其它英文字符全部保留即可;如果len==k,将英文字符全部保留即可;如果len>k,说明原串字符个数多了,需要有(len-k)个字符被减去。当然这其中还有一些输出"Impossible"的特判,就交给各位读者思考吧~

c++ STL string立大功

string.length() : 返回字符串长度

count(string.begin(), string.end(), char c):从头到尾统计字符串里某个字符出现次数

string(size_t n, char c):用构造函数将n个字符c转化为string对象

        其它的转化方法可参考c++转换char为string的几种方式 - 百度文库 (baidu.com)

string.insert(size_t pos, const string& str):在下标pos位置上插入字符串str

string.erase(size_t pos = 0, size_t len = npos):从下标pos开始删除长度为len的子字符串

remove(string.begin(), string.end(), char c):删除字符串中的所有字符c,用未被删除的字符覆盖已删除的字符的位置,返回指向 最后一个 未被删除的字符 的下一个位置 的迭代器(可看作Newend)。故搭配上面的erase使用,可实现删除掉字符串中的所有字符c:string.erase(remove(string.begin(), string.end(), 'a'), str.end());

        关于remove可参考C++从string中删除所有的某个特定字符 - 柳正来 - 博客园 (cnblogs.com)

replace(string.begin(),string.end(),char c1,char c2):将字符串中的字符c1全部替换为c2
        关于replace的函数原型可参考官方手册https://cplusplus.com/reference/algorithm/replace/

更多有关string的操作可参考C++ string详解,C++字符串详解 (biancheng.net)C++ string类(C++字符串)完全攻略 (biancheng.net)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值