前言
LeetCode打卡第八天,今天的题目是给定两个字符串 s 和 t ,判断它们是否是同构的
一、Python代码
class Solution(object):
def isIsomorphic(self, s, t):
"""
:type s: str
:type t: str
:rtype: bool
"""
if (len(s) != len(t) or len(set(s)) != len(set(t))):
return False
z = dict()
for i in range(len(s)):
if s[i] in z:
if z[s[i]] != t[i]:
return False
else:
z[s[i]] = t[i]
for k, v in z.items():
for m, n in z.items():
if (k == m and v != n) or (k != m and v == n):
return False
return True
首先比较两个字符串长度是否一致
之后创建一个空的字典,遍历两个字符串,将s作为key,t作为value,如果字典中有一样的key,就比较该下标的t是否一样
如果没有一样的key,将改下标的s和t值存入字典。
最后遍历字典,查看是否有value一样但是key不一样的元素。
二、C++代码
1.源代码
class Solution {
public:
bool isIsomorphic(string s, string t) {
if (s.size() != t.size()) {
return false;
}
std::map<char, char> s_to_t; // 从 s 到 t 的映射
std::map<char, char> t_to_s; // 从 t 到 s 的映射
for (int i = 0; i < s.size(); i++) {
char s_char = s[i];
char t_char = t[i];
// 检查 s 到 t 的映射是否一致
if (s_to_t.find(s_char) != s_to_t.end() && s_to_t[s_char] != t_char) {
return false;
}
// 检查 t 到 s 的映射是否一致
if (t_to_s.find(t_char) != t_to_s.end() && t_to_s[t_char] != s_char) {
return false;
}
// 建立双向映射
s_to_t[s_char] = t_char;
t_to_s[t_char] = s_char;
}
return true;
}
};
首先还是比较两个字符串长度是否一致。
之后建立一个双向的映射,两个map,s和t互为key和value。
使用map.find()查找两个map中是否有key一样,但是value不一样的元素
总结
今天的收获在于学会了使用双向映射,建立两个map,互为key,value,查找是否有相同的key不同value的元素。