【周末夜校】混音问题——字符串函数

湖南大学信息科学与工程学院第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

  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值