205. 同构字符串

给定两个字符串 st ,判断它们是否是同构的。

如果 s 中的字符可以按某种映射关系替换得到 t ,那么这两个字符串是同构的。

每个出现的字符都应当映射到另一个字符,同时不改变字符的顺序。不同字符不能映射到同一个字符上,相同字符只能映射到同一个字符上,字符可以映射到自己本身。

示例 1:

 输入:s = "egg", t = "add"
 输出:true

示例 2:

 输入:s = "foo", t = "bar"
 输出:false

示例 3:

 输入:s = "paper", t = "title"
 输出:true

提示:

  • 1 <= s.length <= 5 * 104

  • t.length == s.length

  • st 由任意有效的 ASCII 字符组成

参考答案(哈希表)

O(n*)算法,这里直接使用的是Java里面的HashMap进行哈希表映射,但是这算法还不是最优的。

 class Solution {
     public boolean isIsomorphic(String s, String t) {
         // 检查两个字符串的长度是否相同,如果不同则直接返回false
         if (s.length() != t.length()) {
             return false;
         }
 ​
         // 使用两个Map来分别映射s和t中的字符到它们对应的字符
         Map<Character, Character> sToT = new HashMap<>();
         Map<Character, Character> tToS = new HashMap<>();
 ​
         for (int i = 0; i < s.length(); i++) {
             char c1 = s.charAt(i);
             char c2 = t.charAt(i);
 ​
             // 如果s中的字符c1已经映射到了另一个字符,或者t中的字符c2已经映射到了另一个字符
             if (sToT.containsKey(c1) && sToT.get(c1) != c2 || 
                 tToS.containsKey(c2) && tToS.get(c2) != c1) {
                 return false;
             }
 ​
             // 建立映射关系
             sToT.put(c1, c2);
             tToS.put(c2, c1);
         }
 ​
         // 如果所有字符都正确映射,返回true
         return true;
     }
 }

执行耗时:

Java算法耗时

参考答案(哈希关联容器)

 class Solution {
 public:
     bool isIsomorphic(string s, string t) {
         unordered_map<int,int> st;
         int n=s.size(),m=t.size(),d=m/n;
         for(int i=0;i<n;i++){
             int a=s[i],b=d>1?stoi(t.substr(i*d+2,3)):t[i];//截取unicode码的后三位代替ascii码
             if(st[a+128]!=st[b])return false;
             st[a+128]=st[b]=i+1;
         }
         return true;
     }
 };

什么鬼东西这么抽象