一、题目描述
给你一个字符串 S ,要求你将字符串中出现的所有 gzu (不区分大小写)子串删除,输出删除之后的 S 。
就是说出现Gzu、GZU 、GZu、 gzU 等都可以删除。
输入格式
一行不包含空格的字符串 S 。
输出格式
删除之后的 S 。
因删除子串而产生的gzu (不区分大小写)子串无需处理。
数据范围
输入字符串长度不超过100。
输入样例:
GzzGzukkgzUuu
输出样例:
Gzzkkuu
二、题目思路
语言:C语言
思路:
- 首先利用 fgets() 函数进行输入,这里不建议使用 scanf() 函数一个字符一个字符边输入边判断,容易出问题。(我这里使用的是fgets,大家可以使用其他)。
- 定义一个新数组作为答案数组。循环遍历原数组 S ,判断 S[i]、S[i+1]、S[i+2] 三个字符是否为 gzu(不区分大小写)。如果是,就直接 i+=2; continue; 相当于把这三个字符删去了。如果不是,就将 S[i] 赋值给 newS[n]。具体如下:
for(int i=0; i<len; i++){ if((S[i]=='g' || S[i]=='G') && (S[i+1]=='z' || S[i+1]=='Z') && (S[i+2]=='u' || S[i+2]=='U')){ i+=2; continue; } newS[n++] = S[i]; }
- 这里就会出现一个问题,当 i 是最后两个字符时,这个判断就会越界。因此要在这个判断前再加一个判断,如果剩余最后两个字符,则一定不会被删除,直接赋值给结果数组。如下:
if(i==len-1 || i==len-2){ newS[n++] = S[i]; continue; }
三、代码实现
#include<bits/stdc++.h>
using namespace std;
char S[102];
char newS[102];
int n=0;
int main(){
for(int i=0; i<102; i++) S[i] = '0'; // 初始化数组
fgets(S,102,stdin);
int len = strlen(S) - 1;
S[len] = '\0';
for(int i=0; i<len; i++){
if(i==len-1 || i==len-2){
newS[n++] = S[i];
continue;
}
if((S[i]=='g' || S[i]=='G') && (S[i+1]=='z' || S[i+1]=='Z') && (S[i+2]=='u' || S[i+2]=='U')){
i+=2;
continue;
}
newS[n++] = S[i];
}
puts(newS);
return 0;
}
四、运行结果