【问题描述】
给定两个字符串 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
【评分标准】
思路:1.长度不一样肯定不行
2.查看过的记录一下,遇到相同的对比记录之前查看的上下字符是否一致(这样可以排除一对多或者多对一的问题)
标签:字符,同构,映射,ss,tt,样例,vector,字符串,size From: https://blog.csdn.net/2401_88485715/article/details/145030095#include<iostream>
#include<vector>
#include<string>
using namespace std;bool compare(char s, vector<char>& x) {
for (size_t i = 0; i < x.size(); i++) {
if (s == x[i]) {
return false;
}
}
return true;
}int main() {
string s, t;
cin >> s;
cin >> t;
vector<char> ss;
vector<char> tt;
vector<char> x;
vector<char> x2;
// 将 s 和 t 中的字符存储到相应向量中
for (char c : s) ss.push_back(c);
for (char c : t) tt.push_back(c);// 首先检查长度是否相等
if (ss.size()!= tt.size()) {
cout << "false";
return 0;
}for (size_t i = 0; i < ss.size(); i++) {
// 检查当前字符是否已经处理过
if (compare(ss[i], x)) {
x.push_back(ss[i]);
if(compare(tt[i],x2)){// 检查当前字符是否已经处理过
x2.push_back(tt[i]);
char target = tt[i];
for (size_t j = i + 1; j < ss.size(); j++) {
// 检查后续相同字符的映射是否正确
if (ss[j] == ss[i]) {
if (tt[j]!= target) {
cout << "false";
return 0;
}
}
}
}
else{
cout << "false";
return 0;
}
}
}
cout << "true";
return 0;
}