大致题意:给定一个用'?'和'*'编码的字符串,其中包含有小写英文字符及'?'和'*'两种字符,这两种字符必定跟在一个英文字符后面。现对其进行解码。可进行的操作如下:
若一个字符后跟着 '?' ,则该字符可被删除或留下
若一个字符后跟着 '*' ,则该字符可被删除或留下或重复无数次
现给出一个不超过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)