同构字符串(用新学的map)

一、题目

【问题描述】

给定两个字符串 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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值