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;
}
posted @   DawnTraveler  阅读(5)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示