给定两个字符串 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;
}
};