一、题目
【问题描述】
给定两个字符串 s
和 t
,判断它们是否是同构的。如果是同构的,输出true,否则,输出false。
注:如果 s
中的字符可以按某种映射关系替换得到 t
,那么这两个字符串是同构的。每个出现的字符都应当映射到另一个字符,同时不改变字符的顺序。不同字符不能映射到同一个字符上,相同字符只能映射到同一个字符上,字符可以映射到自己本身。
【输入形式】
输入由两行组成,第一行为字符串s,第二行为字符串t
【输出形式】
输出包含一行,值为true或者false
【样例输入1】
egg add
【样例输出1】
true
【样例说明1】
字符串s中的'e'映射成'a','g'映射成'd',可以转化成字符串t。
【样例输入2】
foo bar
【样例输出2】
false
【样例说明2】
字符串s中的'o'映射成'a'和'r',不符合条件。
【样例输入3】
paper title
【样例输出3】
true
二、代码思路
自己数学算出映射感觉是不太显示的。想到之前做图书馆管理系统的时候为了匹配用户名的和密码,用了个unordered_map.这次就顺带的学习一下。用键位值一一对应,找到不对应的就输出错误
三、代码实现
1.数据的获取,顺便判断一下长度是否相等,不等的话肯定就不对了
string s, t;
cin >> s >> t;
int len1 = s.size(), len2 = t.size();
if (len1 != len2) {
cout << false;
return 0;
}
2.用map来构造映射(但有个问题是一个map只能写一个映射(比如s->t),但这题要的是一一映射,所以我们copy一个map,一个map来记录s->t,一个map用来记录t->s)
bool sign = true;
unordered_map<char, char> my_map;
for (int i = 0; i < len1; i++) {
char key = s[i];
if (my_map.find(key) == my_map.end()) { //说明不存在这个键位
my_map[s[i]] = t[i];
}
else { //如果找到了这个键位
char a = t[i];
if (a != my_map[key]) { //说明现在这个映射和之前的键位的值不同
sign = false;
break;
}
}
}
//bug1:不止要看多对一的情况,也要看一对多的情况
unordered_map<char, char> Valmy_map;
for (int i = 0; i < len1; i++) {
char key = t[i];
if (Valmy_map.find(key) == Valmy_map.end()) { //说明不存在这个键位
Valmy_map[t[i]] = s[i];
}
else { //如果找到了这个键位
char a = s[i];
if (a != Valmy_map[key]) { //说明现在这个映射和之前的键位的值不同
sign = false;
break;
}
}
}
3.结果输出
if (sign) {
cout << "true" << endl;
}
else cout << "false" << endl;
return 0;
四、完整代码
#include<iostream>
#include<vector>
#include<unordered_map>
using namespace std;
int main() {
string s, t;
cin >> s >> t;
int len1 = s.size(), len2 = t.size();
if (len1 != len2) {
cout << false;
return 0;
}
bool sign = true;
unordered_map<char, char> my_map;
for (int i = 0; i < len1; i++) {
char key = s[i];
if (my_map.find(key) == my_map.end()) { //说明不存在这个键位
my_map[s[i]] = t[i];
}
else { //如果找到了这个键位
char a = t[i];
if (a != my_map[key]) { //说明现在这个映射和之前的键位的值不同
sign = false;
break;
}
}
}
//bug1:不止要看多对一的情况,也要看一对多的情况
unordered_map<char, char> Valmy_map;
for (int i = 0; i < len1; i++) {
char key = t[i];
if (Valmy_map.find(key) == Valmy_map.end()) { //说明不存在这个键位
Valmy_map[t[i]] = s[i];
}
else { //如果找到了这个键位
char a = s[i];
if (a != Valmy_map[key]) { //说明现在这个映射和之前的键位的值不同
sign = false;
break;
}
}
}
if (sign) {
cout << "true" << endl;
}
else cout << "false" << endl;
return 0;
}