LeetCode205. 同构字符串

既然同一个字符如果要替换,就都得替换成相同的字符,我们可以开哈希表记录某个字符映射成了哪个别的字符,但是由于两个字符不能映射到相同的字符上,如果a映射成o,r也映射成o,那么bar就可以替换成foo了,这是不符合题意的。

我们注意到,如果我们对foo也建立一个哈希表,那么o只能映射成一个字符,foo就不能映射成bar了。

因此我们可以开两个哈希表st和ts分别记录s到t和t到s的字符映射关系,然后我们遍历两个字符串,看一下相同的字符是否都映射到了同样相同的字符上。

代码如下:

class Solution {
public:
    bool isIsomorphic(string s, string t) {
        if(s.size() != t.size()) {
            return false;
        }
        int size = s.size();
        unordered_map<char, char> st, ts;
        for(int i = 0; i < size; ++i) {
            if(!st.count(s[i])) {            //如果哈希表st中之前没有记录字符s[i]应该映射为哪个字符
                st[s[i]] = t[i];             //那就记录一下s[i]要映射到t[i]
            } else {
                if(st[s[i]] != t[i]) {       //否则,说明这个字符不是第一次出现了,我们把(记录过的)他应该映射成的字母和t[i]对比一下,如果不相等,说明s和t不同构
                    return false;
                }
            }
            if(!ts.count(t[i])) {            //这个if语句和上面同理,记录t到s的字符映射关系
                ts[t[i]] = s[i];
            } else {
                if(ts[t[i]] != s[i]) {
                    return false;
                }
            }
        }
        return true;
    }
};
posted @ 2020-08-04 19:28  machine_gun_lin  阅读(70)  评论(0编辑  收藏  举报