1093 字符串A+B (20分)
给定两个字符串 A 和 B,本题要求你输出 A+B,即两个字符串的并集。要求先输出 A,再输出 B,但重复的字符必须被剔除。
一、输入格式
输入在两行中分别给出 A 和 B,均为长度不超过 1 0 6 10^6 106 的、由可见 ASCII 字符 (即码值为32~126)和空格组成的、由回车标识结束的非空字符串。
二、输出格式
在一行中输出题面要求的 A 和 B 的和:
1.输入样例:
示例如下:
This is a sample test
to show you_How it works
2.输出样例:
This ampletowyu_Hrk
思路:
很简单的一道题目,我们容易想到的就是字符串接收数据,然后双重循环判断,不重复输出,显然这种方法不太可行。
我们这里用映射的方法解决此问题,我们知道,对于一个小写的英文字母(a ~ z)来说,我们可以将它们和整数0 ~ 25 构建成一一映射的关系。来记录每一个字母出现的次数。
到这里我们这道题目就有了思路,可以将题目输入的可见 ASCII 字符 (码值为32~126)的字符和整数一一建立映射(建立一个整型数组),这样,我们用数组中的0代表没输出过此字符,1代表输出过此字符。
显然数组初始化为0,为了节省空间,我们将映射关系到从0到(126 - 32 + 1),这样,我们就用线性的空间解决了此问题,代码如下:
#include<bits/stdc++.h>
using namespace std;
int hashM[95] = {0};//初始化为0代表每一个字符都没有被输出过
int main(){
string a1 , a2;
getline(cin , a1);
getline(cin , a2);
a1 = a1 + a2;
for(int i = 0 ; i < a1.size() ; i++){
if(hashM[a1[i] - 32] == 0){
cout << a1[i]; //没有输出过,则可以将其输出。
hashM[a1[i] - 32] = 1; //将出现过的字符映射标记已经输出过。
}
}
}