跳转至

205.同构字符串 (Easy)*

题目描述*

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

如果 s 中的字符可以被替换得到 t ,那么这两个字符串是同构的。

所有出现的字符都必须用另一个字符替换,同时保留字符的顺序。两个字符不能映射到同一个字符上,但字符可以映射自己本身。

示例*

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

输出: true

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

输出: false

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

输出: true

说明*

可以假设 s 和 t 有相同的长度。

代码*

方法一*

可以两个字符串互相映射,如果有多对一的映射则返回 false。

class Solution {
public:
    bool isIsomorphic(string s, string t) {
        unordered_map<char, char> strMap;
        unordered_map<char, char> tMap;
        for(int i = 0; i < s.length(); i++) {
            if(strMap.count(s[i])) {
                if(strMap[s[i]] != t[i]) {
                    return false;
                }
            }
            if(tMap.count(t[i])) {
                if(tMap[t[i]] != s[i]) {
                    return false;
                }
            }
            strMap[s[i]] = t[i];
            tMap[t[i]] = s[i];
        }
        return true;
    }
};

方法二*

可以比较两个字符在字符串中第一次出现的位置,或者记录上一次出现的位置。

class Solution {
public:
    bool isIsomorphic(string s, string t) {
        for(int i = 0; i < s.length(); i++) {
            if(s.find(s[i]) != t.find(t[i])){
                return false;
            }
        }
        return true;
    }
};

速度相差还是比较多的,前一种 20ms,后面这个 8ms。


最后更新: July 23, 2022