DreamJudge-1027-删除字符串2
1.题目描述
Time Limit: 1000 ms
Memory Limit: 256 mb
给你一个字符串S,要求你将字符串中出现的所有"gzu"(不区分大小写)子串删除,输出删除之后的S。
就是说出现“Gzu”、“GZU”、“GZu”、"gzU"都可以删除。
输入输出格式
输入描述:
输入一行字符串S,长度不超过100。
输出描述:
输出进行删除操作之后的S。
输入输出样例
输入样例#:
GzzGzukkgzUuu
输出样例#:
Gzzkkuu
题目来源
贵州大学2019机试
2.题解
2.1 字符串删除(原地修改)
思路
这里我先思考使用find函数找到字符串"GZU",但是我发现这里不区分大小写,这就让这种写法很难进行下去,所以我最后选择了判断连续三个字符的方式
其次如果我们想要删除这三个字符,就一定注意要更新字符串总长度n,因为我们的条件是根据n来判断结束条件的!!!
代码
#include <iostream>
#include <string>
using namespace std;
int main() {
string str;
getline(cin, str);
int n = str.length();
int i = 0; // 使用变量 i 来遍历整个字符串
while (i < n - 2) { // 确保至少有三个字符可以用于匹配
if ((str[i] == 'G' || str[i] == 'g') && (str[i + 1] == 'Z' || str[i + 1] == 'z') && (str[i + 2] == 'u' || str[i + 2] == 'U')) {
str.erase(i, 3); // 删除匹配的子串
n = str.length(); // 更新字符串长度
} else {
++i; // 检查下一个位置
}
}
cout << str;
return 0;
}
2.2 跳过字符串
思路
上面那种不断删除字符串的方式,需要频繁创建新的字符串,消耗非常大
这里我们换一种思路:遇到连续的“GZU”,就跳过这三个字符; 否则则输出当前字符,边遍历边输出
代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
string str;
getline(cin, str);
for(int i = 0; i < str.size(); i ++)
{
if((str[i] == 'g' || str[i] == 'G')
&& (str[i + 1] == 'z' || str[i + 1] == 'Z')
&& (str[i + 2] =='u' || str[i + 2] == 'U'))
{
i += 2;
continue;
}
cout << str[i] ;
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了