Flog

阿酱日常写码的碎碎念

0%

LeetCode做题记录

205.同构字符串

思路分析

  • 我们可以利用一个 HashMap 来处理映射。对于 s 到 t 的映射,我们同时遍历 s 和 t ,假设当前遇到的字母分别是 c1 和 c2 。

  • 如果 map[c1] 不存在,那么就将 c1 映射到 c2 ,即 map[c1] = c2。

  • 如果 map[c1] 存在,那么就判断 map[c1] 是否等于 c2,也就是验证之前的映射和当前的字母是否相同。

  • 对于这道题,我们只需要验证 s - > t 和 t -> s 两个方向即可。如果验证一个方向,是不可以的。

  • 举个例子,s = ab, t = cc,如果单看 s -> t ,那么 a -> c, b -> c 是没有问题的。

  • 必须再验证 t -> s,此时,c -> a, c -> b,一个字母对应了多个字母,所以不是同构的。代码的话,只需要调用两次上边的代码即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
egg 和 add 同构,就意味着下边的映射成立
e -> a
g -> d
也就是将 egg 的 e 换成 a, g 换成 d, 就变成了 add

同时倒过来也成立
a -> e
d -> g
也就是将 add 的 a 换成 e, d 换成 g, 就变成了 egg

foo 和 bar 不同构,原因就是映射不唯一
o -> a
o -> r
其中 o 映射到了两个字母
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public boolean isIsomorphic1(String s,String t){
return isIsomorphicHelper(s,t) && isIsomorphicHelper(t,s);
}

public boolean isIsomorphicHelper(String s, String t) {
int len = s.length();
HashMap<Character,Character> map = new HashMap<>();
for (int i=0;i<len;i++){
char c1 = s.charAt(i);
char c2 = t.charAt(i);
if (!map.containsKey(c1)){
map.put(c1,c2);
}else {
if (map.get(c1)!=c2){
return false;
}
}
}
return true;
}