L1-011 A-B 字符串输入的处理

本文介绍了如何处理字符串输入,通过使用strchr和fgets函数,以O(n^2)的时间复杂度高效地从字符串A中移除字符串B出现的所有字符,实现A-B的计算。同时讨论了fgets处理空格和换行符的问题。
摘要由CSDN通过智能技术生成

L1-011 A-B 字符串输入的处理

本题要求你计算AB。不过麻烦的是,AB都是字符串 —— 即从字符串A中把字符串B所包含的字符全删掉,剩下的字符组成的就是字符串AB

输入格式:

输入在2行中先后给出字符串AB。两字符串的长度都不超过104,并且保证每个字符串都是由可见的ASCII码和空白字符组成,最后以换行符结束。

输出格式:

在一行中打印出AB的结果字符串。

输入样例:

I love GPLT!  It's a fun game!
aeiou

输出样例:

I lv GPLT!  It's  fn gm!
思路

这道题我起初的思路是两层循环从头遍历到尾然后出现AB重复的数时 A数组往前移动一格这实现去重 但是要花n^3的时间复杂度 一个样例超时了

借鉴网上的做法是用到string库里的strchr()函数,返回出现相同字符的第一个指针,没找到则返回null ,strchr()的时间复杂度是n

整个程序的时间复杂度是n^2

输出A-B无非就是把不重复的输出出来,我的思路就是把重复的去除,和我思路类似的是把不重复的拿出来依次放在同一个数组,再循环覆盖直至全都遍历,但是网上更好的方法是直接不输出跳过,不对原数组进行操作

字符串输入的处理

这道题是包含空格的 用传统的scanf(“%s”),读入是不行的遇到空格会判断语句输入完成 这个时候就要用到fgets(*a,num,stdin)

fgets可以读入空格但是此时fgets会把缓冲区的回车’\n’读入,比如字符串输入abcd用strlen来计算长度此时strlen的长度是5而且此时输出这个字符串的时候’\n‘回车是会被输出的。

所以就引来了对fgets的处理问题,从网上看到的处理方法:

#include<stdio.h>
#include<string.h>
#define N 1000010
char*MyFgets(char data[],int n){//函数类型是char* 
	fgets(data,n,stdin);
	char *find=strchr(data,'\n');//找到'\n'并把它改成'0' 
	if(find)*find='\0';
} 
char a[N],b[N];
int main(){
	MyFgets(a,N),MyFgets(b,N);
	int la=strlen(a),lb=strlen(b);
	for(int i=0;i<la;i++){
		if(strchr(b,a[i])){//ab有重复的值 
			continue;//如果有重复的值就直接跳过 
		}else printf("%c",a[i]);//没有重复就直接输出 
	}
} 

如果只有一个字符串输入的话可以这样写

#include<stdio.h>
#include<string.h>
#define N 10010
char a[N],b[N];
int main(){
	fgets(a,10010,stdin);
	fgets(b,10010,stdin);
	*strchr(a,'\n') ='\0';
    *strchr(b,'\n') ='\0';如果就只有一两个字符串的话这样写会更快一点 其实速度差不多
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值