【字符串处理】L1-101别再来这么多猫娘了

题目主要围绕对输入的字符串进行处理,包括读取包含违禁词的文本字符串,在该字符串中查找并统计特定的违禁词出现的次数,以及根据违禁词出现的次数对字符串进行不同方式的修改和输出。例如,将违禁词替换为特定的字符串,这些操作都涉及到对字符串的各种操作和处理技巧。

在这里插入图片描述

输入样例

5
MaoNiang
SeQing
BaoLi
WeiGui
BuHeShi
4
BianCheng MaoNiang ba! WeiGui De Hua Ye Keyi Shuo! BuYao BaoLi NeiRong.

输出样例

BianCheng <censored> ba! <censored> De Hua Ye Keyi Shuo! BuYao <censored> NeiRong.

输入样例2

5
MaoNiang
SeQing
BaoLi
WeiGui
BuHeShi
3
BianCheng MaoNiang ba! WeiGui De Hua Ye Keyi Shuo! BuYao BaoLi NeiRong.

输出样例2

3
He Xie Ni Quan Jia!
算法思路
  1. 输入处理
  • 读取违禁词列表:
    • 首先从标准输入读取一个整数 n,它代表违禁词的数量。
    • 接着使用 vector<string> 容器 banned 来存储这些违禁词,通过循环 n 次,依次将每个违禁词读入到 banned 向量中。
  • 读取阈值和待处理文本:
    • 读取一个整数 k,它是判断是否进行严格处理的阈值。
    • 使用 cin.ignore() 忽略上一次输入时可能残留的换行符,避免影响后续读取。
    • 然后使用 getline(cin, text) 读取一整行文本,这行文本就是需要进行违禁词检测和替换的目标文本。

2. 违禁词检测与替换

  • 初始化:
    • 初始化一个计数器 count 为 0,用于记录文本中出现的违禁词总数。
    • text 赋值给 result,后续的替换操作将在 result 上进行,以保证原始 text 内容不变。
  • 遍历违禁词列表:
    • 对于 banned 向量中的每个违禁词 word,使用 while 循环结合 result.find(word, pos) 方法来查找 wordresult 中的位置。pos 是查找的起始位置,初始化为 0。
    • find方法返回的位置不是string::npos表示找到了违禁词)时,执行以下操作:
      • count 加 1,表示检测到一个违禁词。
      • 使用 result.replace(pos, word.length(), "___") 将找到的违禁词替换为 "___"
      • pos 加上 3,即移动到替换后的 "___" 之后的位置,继续查找下一个可能出现的该违禁词。

3. 结果判断与输出

  • 当违禁词数量小于阈值:
    • 如果 count < k,说明文本中的违禁词数量较少,需要进一步将 "___" 替换为 "<censored>"。同样使用 while 循环结合 result.find("___", pos) 查找 "___" 的位置。
    • 找到后,使用 result.replace(pos, 3, "<censored>") 进行替换,然后 pos 加上 10,移动到替换后的 "<censored>" 之后的位置继续查找。
    • 最后输出处理后的 result 文本。
  • 当违禁词数量大于等于阈值:
    • 如果 count >= k,说明文本中的违禁词数量较多,此时输出 count 的值,然后输出 "He Xie Ni Quan Jia!"
代码示例
#include<iostream>
#include<vector>
#include<string>
using namespace std;

int main(){
    int n;
	cin>>n;
	vector<string> banned(n);//创建字符串向量,存储输入的违禁词 
	for(int i=0;i<n;i++){
		cin>>banned[i]; 
	} 
	int k;
	cin>>k;
	cin.ignore();//忽略上一次输入,避免影响后续读取文本 
	string text;
	getline(cin,text);//用getline读取一整行文本 
    
    //统计违禁词的数量并进行替换
	int count=0;
	string result=text;
	//遍历存储所有违禁词的向量
	for(const string& word : banned){
		size_t pos=0;
		while((pos=result.find(word,pos)) != string::npos){
			count++;
			result.replace(pos,word.length(),"___");
			pos += 3;//移动到替换后的位置                                
		}
	} 
	if(count < k){
		size_t pos=0;
		while((pos = result.find("___",pos)) != string::npos){
			result.replace(pos,3,"<censored>");
			pos += 10;//移动到替换后的位置之后 
		}
		cout<<result<<endl; 
	} 
	else{
		cout<<count<<endl;
		cout<<"He Xie Ni Quan Jia!"<<endl;
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值