pat-1050 String Subtraction (20分)

在这里插入图片描述

大概的题意如下:给你两个字符串:
分别是s1和s2,如果s2出现的字符在s1中也出现了。那么在s1字符串中挖掉s2出现的字符。

作为闫总的徒弟,这一题还是有很多的地方可以说的。
第一点(1):关于复杂度的问题,一秒钟C++大概可以计算10的八次次运算。但是这一题也是蛮奇怪的,给了你0.1秒,可是计算量已经超过10的八次方了。 接下来我会给出题解一。算是暴力做法
(2):关于输入输出的问题,因为输入的时候出现了问题。如果仅仅是以流的形式进行输入,那么肯定出现错误,因为遇到空格就不在输入了。以后我会探讨关于输入的问题

这是直接cin进行输入的:
在这里插入图片描述
(3):关于优化的问题:O(n²)的复杂度相对来说是不太能接受的,性能上还是可以去优化的。

题解一:算是暴力做法

#include <iostream>
using namespace std;
string s1,s2;
bool check_exists(char c){
	for(auto b:s2)
		if(b==c) 
			return true;
	return false;
}
int main(){
	string res;
	getline(cin,s1); 
	getline(cin,s2); 
	//cin>>s1>>s2;//注意这个无法输入包含空格的字符串 
	for(auto a:s1)
		if(!check_exists(a))
			res+=a;
	cout<<res<<endl;
}

题解2:
其实优化还是出现在检查字符上,判断字符某一字符在字符串中出现了。

#include <iostream>
#include <unordered_set>
using namespace std;
string s1,s2;
int main(){
	string res;
	getline(cin,s1); 
	getline(cin,s2);
	unordered_set<char> hash;//定义哈希表 
	for(auto a:s2) hash.insert(a);//将s2的字符插入哈希表  
	for(auto a:s1)
		if(!hash.count(a)) 
			res+=a;
	cout<<res<<endl;
}

猜你喜欢

转载自blog.csdn.net/weixin_44110100/article/details/106845241