给定两个字符串 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的映射的唯一性进行判断。这里就不一一描述了。
public class Solution {
/**
* @param s: a string
* @param t: a string
* @return: true if the characters in s can be replaced to get t or false
*/
public boolean isIsomorphic(String s, String t) {
// write your code here
char[] ss = s.toCharArray();
char[] tt = t.toCharArray();
if(ss.length != tt.length)
return false;
Map<Character, Character> map1 = new HashMap<>();//s ---> t
Map<Character, Character> map2 = new HashMap<>();//t ---> s
for(int i=0; i<ss.length; i++){
if(map1.get(ss[i]) != null && map1.get(ss[i]) != tt[i])
return false;
if(map2.get(tt[i]) != null && map2.get(tt[i]) != ss[i])
return false;
map1.put(ss[i], tt[i]);
map2.put(tt[i], ss[i]);
}
return true;
}
}