🚀 问题描述
如果两个字符串 s 和 t 满足以下条件,则它们是同构的:
s中的每个字符都可以被替换为t中的唯一字符。s中字符的顺序在t中得以保留。s中的两个字符不能映射到t中的同一个字符,反之亦然。
💡 示例
示例 1
            
            
              js
              
              
            
          
          输入:s = "egg", t = "add"
输出:true
解释:'e' 映射到 'a','g' 映射到 'd'。
        示例 2
            
            
              js
              
              
            
          
          输入:s = "foo", t = "bar"
输出:false
解释:'o' 不能同时映射到 'a' 和 'r'。
        示例 3
            
            
              js
              
              
            
          
          输入:s = "paper", t = "title"
输出:true
解释:'p' 映射到 't','a' 映射到 'i',依此类推。
        🏆 JavaScript 解决方案
我们使用 两个哈希表 来解决这个问题:
- 将 
s中的字符映射到t中的字符。 - 确保 
s中的两个字符不会映射到t中的同一个字符。 
实现代码
            
            
              js
              
              
            
          
          var isIsomorphic = function(s, t) {
    if (s.length !== t.length) return false;
    const mapST = {}; // s 到 t 的映射
    const mapTS = {}; // t 到 s 的映射
    for (let i = 0; i < s.length; i++) {
        const charS = s[i];
        const charT = t[i];
        if ((mapST[charS] && mapST[charS] !== charT) ||
            (mapTS[charT] && mapTS[charT] !== charS)) {
            return false;
        }
        mapST[charS] = charT;
        mapTS[charT] = charS;
        
        console.log('mapST', mapST)
        console.log('charT', charT)
    }
    return true;
};
console.log(isIsomorphic('egg', 'add'))
// console.log(isIsomorphic('foo', 'bar'))
// console.log(isIsomorphic('paper', 'title'))
        🔍 工作原理
- 检查长度:
 
- 
- 如果两个字符串长度不同,它们不可能是同构的。
 
 
- 使用两个映射表:
 
- 
mapST:将s中的字符映射到t中的字符。mapTS:将t中的字符映射到s中的字符。
 
- 遍历字符:
 
- 
- 对于 
s和t中的每对字符,检查映射是否一致。 - 如果不一致,返回 
false。 
 - 对于 
 
- 返回 
true: 
- 
- 如果所有字符的映射都一致,则这两个字符串是同构的。
 
 
🔑 复杂度分析
- 时间复杂度 :
O(n),其中n是字符串s(或t)的长度。 
- 
- 每个字符只会被处理一次。
 
 
- 空间复杂度 :
O(1),因为哈希表最多可以存储256个条目(ASCII 字符)。 
📋 手动运行示例
输入:s = "egg", t = "add"
输出:true
✨ 面试技巧
- 边界情况:
 
- 
- 不同长度的字符串:
s = "abc",t = "ab"。 - 单字符字符串:
s = "a",t = "a"。 - 重复字符:
s = "aaa",t = "bbb"。 
 - 不同长度的字符串:
 
- 讨论两个映射表:
 
- 
- 需要双向映射以避免冲突。
 
 
- 优化:
 
- 
- 强调这种方法的时间复杂度为 
O(n),这是解决此问题的最佳方法。 
 - 强调这种方法的时间复杂度为 
 
LeetCode: leetcode.com/problems/is...