湖南大学信息科学与工程学院第15届生涯规划节周末夜校之C++讲座
(Date:20201205,面向2020级大一新生)
Description
维亚是一家音乐俱乐部里的音乐DJ,在工作中经常使用Dubstep(回响贝斯)音乐。最近,他决定拿出几首老歌进行混音处理。
假定一首歌的歌词是一句英文句子,为了将Dubstep混录到歌曲里,维亚将一定数量(可以为0)的“WUB”插入到歌词的第一个单词之前、最后一个单词之后(可以为0)、以及两个单词之间(在相邻的一对单词之间至少一个),然后他将所有的单词包括“WUB”合并在一起形成一个混音字符串,在俱乐部里播放。
例如,歌词"I AM X"可以转换为回响贝斯混音“WUBWUBIWUBAMWUBWUBX”,但不能转换为“WUBWUBIAMWUBX”。
有人突发奇想,在听过维亚播放过的混音之后,尝试恢复原始的歌曲,请你帮助他。
Input
输入为一行非空字符串,由英文字母组成,长度不超过200个字符。表示这是经过混音之后的歌词,
输入保证在混入“WUB”之前,原始歌词中不包括“WUB”,且歌词至少包含一个单词。
Output
输出为一行一个字符串,表示原始的歌词。
Sample Input
WUBWEWUBAREWUBWUBTHEWUBCHAMPIONSWUBMYWUBFRIENDWUB
Sample Output
WE ARE THE CHAMPIONS MY FRIEND
本题使用的字符串处理函数(需#include <string.h>)
string s;
s.length():返回字符串的长度
s.find(str):返回s中找到str字符串的下标位置,如果没有找到,返回string::npos
s.replace(start, length, str):将s字符串从第start个字符开始的length个字符,替换为str字符串
s.erase(start, length):将s字符串从第start个字符开始的length个字符删除
补充一个子串函数:
str=s.substr(start, length):将s字符串从第start个字符开始的length个字符取出,作为一个新的字符串存储在str中(子串)
本题思路和分析
将所有的WUB替换成空格。
需要注意两个点:
(1)首尾的WUB需要直接删除或替换为空,避免首尾多余的空格。因此,当s.find("WUB")==0或者s.length()-2的时候(即首尾位置),将WUB换为空串“”。
(2)多个WUB并列的时候,只需要替换第一个WUB为空格。因此,当s.find("WUB")-1==‘ ’(空格)的时候,说明当前找到WUB的位置之前就是一个空格,因此这种情况也需要直接替换WUB为空串,或者删除WUB。
参考代码和注释
解法一(全使用replace,特殊情况替换为空串)
int main()
{
string s;
while(cin>>s)
{
while(s.find("WUB")!=string::npos)
{
if(s.find("WUB")==0 || s.find("WUB")==s.length()-2 || s[s.find("WUB")-1]==' ')
s.replace(s.find("WUB"),3,"");
else
s.replace(s.find("WUB"),3," ");
}
cout<<s<<endl;
}
return 0;
}
解法二(多个WUB并列时,只替换第一个为空格,多余WUB直接删除)
int main()
{
string s;
while(cin>>s)
{
while(s.find("WUB")!=string::npos)
{
if(s.find("WUB")==0 || s.find("WUB")==s.length()-2)
s.replace(s.find("WUB"),3,"");
else if(s[s.find("WUB")-1] == ' ')
s.erase(s.find("WUB"), 3);
else
s.replace(s.find("WUB"),3," ");
}
cout<<s<<endl;
}
retur
拓展阅读
C++ String类处理函数:https://blog.csdn.net/qq_43309286/article/details/93191767