题目描述
思路
两个字符串同构的含义就是s可以唯一映射到t,t也可以唯一的映射到s.
egg 和 add 同构,就意味着下边的映射成立
e -> a
g -> d
也就是将 egg 的 e 换成 a, g 换成 d, 就变成了 add
同时倒过来也成立
a -> e
d -> g
也就是将 add 的 a 换成 e, d 换成 g, 就变成了 egg
使用一个map,来记录从s到t的映射。我们同时遍历 s 和 t ,假设当前遇到的字母分别是 c1 和 c2 。
- 如果 map[c1] 不存在,那么就将 c1 映射到 c2 ,即 map[c1] = c2。
- 如果 map[c1] 存在,那么就判断 map[c1] 是否等于 c2,也就是验证之前的映射和当前的字母是否相同。
我们需要验证 s - > t 和 t -> s 两个方向即可。如果验证一个方向,是不可以的。
func isIsomorphic(s string, t string) bool {
if len(s) == 0 && len(t) == 0 {
return true
}
if len(s) != len(t) {
return false
}
return bilateralCheck(s, t) && bilateralCheck(t, s)
}
func bilateralCheck(s, t string) bool {
m := map[byte]byte{}
for i := 0; i < len(s); i++ {
if m[s[i]] != 0 {
if m[s[i]] != t[i] {
return false
}
} else {
m[s[i]] = t[i]
}
}
return true
}