「脸书」在过年中刷题 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)
 
总结
- 为了更高的收入,需要研究最优解😭
 
