「脸书」在过年中刷题 305 ~ Isomorphic Strings
基本信息
- 题号:305
- 题厂:脸书
- 难度系数:低
判断两个字符串到底是不是 isomorphic,「是」返回 True,「不是」返回 False
s = "egg", t = "add" 返回 True,都是 「122」模式 s = "paper", t = "title" 返回 true,都是 「12134」模式
解题思路
- 既然要检测,那就要生成一个 pattern 来检测他们一致与否。这里可以想到用 「123.。。。」这种形式来表示 pattern
class Solution:
# 我们创建一个 helper 函数来帮忙检测。。。
def helper(self, r: str) -> str:
pattern = []
# hashtable 格式为:「字符:出现个数」
table = {}
counter = 0
for i in range(len(r)):
if r[i] not in table:
pattern.append(str(counter))
table[r[i]] = counter
counter += 1
else:
pattern.append(str(table[r[i]]))
return ",".join(pattern)
# 把字符串输入 helper 获取当前字符串的 pattern
# 如果 2 者相等,返回 true,否则返回 false
def isIsomorphic(self, s: str, t: str) -> bool:
sPattern = self.helper(s)
tPattern = self.helper(t)
if sPattern == tPattern:
return True
return False
除了以上解法,我们也可以适当优化一下。

如果两个字符串格式相同,我们可以创建 2 个 hashmap。key - value 存放 「字符串A 字符 - 对应字符串 B 字符」和「字符串 B 字符 - 对应字符串 A 字符」,从而简化时间复杂度。。。
class Solution:
def isIsomorphic(self, s: str, t: str) -> bool:
sMap = {}
tMap = {}
# for 循环遍历时,如果当前字符 a,b没有出现在 hashtable 里,就按照 「a :b」,「b :a」模式存入绑定;
# 当字符 a 或 b 再次出现时,看他们的对应值与之前的 hash 表是否对应。如果对应则继续,如果不对应,返回 false
for i in range(len(s)):
if s[i] not in sMap and t[i] not in tMap:
sMap[s[i]] = t[i]
tMap[t[i]] = s[i]
elif sMap.get(s[i]) != t[i] or tMap.get(t[i]) != s[i]:
return False
return True
Constraints
1 <= s.length <= 5 * 104t.length == s.lengths and t consist of any valid ascii character.
考试时,可以向考官讨论两个字符串的长度问题。。。。
测试
- ……
Big O
时间复杂度:O(n)- 空间复杂度:O(n)
总结
- 为了更高的收入,需要研究最优解😭