【多次过】Lintcode 638. Isomorphic Strings

给定两个字符串 s 和 t ,确定它们是否是同构的。
两个字符串是同构的如果 s 中的字符可以被替换得到 t。
所有出现的字符必须用另一个字符代替,同时保留字符串的顺序。 没有两个字符可以映射到同一个字符,但一个字符可以映射到自己。

样例

给出 s = "egg", t= "add", 返回 true
给出 s = "foo", t= "bar", 返回 false
给出 s = "paper", t= "title", 返回 true

解题思路:

    判断两个字符串是否同构,要点在于字符串S1与S2中的字符只能一一对应,所以需要用两个map记录相互对应关系,S1中的字符a对应S2中的字符b可以表示为map1:<a,b>与map2:<b,a>,当S1再次出现a时,S2对应位置一定是map1中的b;

    我们可以使用map将s[i]和t[i]对应的添加到哈希表中,但每次添加我们需要查找一下s[i]是否存在于哈希表中,如果不存在就添加,存在就看s[i]映射的字符是否与t[i]相等,如果不等则说明多个字符映射到同一个字符上了,故这两个字符不同构。但是这样我们只检查了s[i]到t[i]的映射,只确定了s[i]—->t[i]的唯一性,我们也要确定t[i]—->s[i]的映射是否唯一。只有这两个相互映射唯一,我们才能说这是同构的。 
可能有些人会怀疑是否还需要对t到s的映射的唯一性进行判断,这里我给出一个反例就可以了,例eggs和adda,可以看出s到t的映射的唯一是唯一的,但是这两个字符串却不是同构的。所以我们还需要对t到s的映射的唯一性进行判断 
举个例子: 
例:egg与add 
首先我们将e->a添加进哈希表,然后查找g是否存在哈希表中,不存在就将其g->d添加进哈希表,然后在判断g是否存在哈希表中,存在就将g映射的字符与d比较如果相同就说明s到t映射唯一,反之说明不唯一。然后我们也需要对t到s的映射的唯一性进行判断。这里就不一一描述了。

class Solution {
public:
    /**
     * @param s: a string
     * @param t: a string
     * @return: true if the characters in s can be replaced to get t or false
     */
    bool isIsomorphic(string &s, string &t) 
    {
        // write your code here
        unordered_map<char, char> m1;   //s --> t
        unordered_map<char, char> m2;   //t --> s
        
        for(int i = 0; i < s.size(); i ++)
        {
            // the same char in s map to different chars in t
            if(m1.find(s[i]) != m1.end() && m1[s[i]] != t[i])
                return false;
            // two different chars in s map tp the same char in t
            if(m2.find(t[i]) != m2.end() && m2[t[i]] != s[i])
                return false;
                
            m1[s[i]] = t[i];
            m2[t[i]] = s[i];
        }
        
        return true;
    }
};


猜你喜欢

转载自blog.csdn.net/majichen95/article/details/80811118