文章目录
205. 同构字符串
给定两个字符串 s
和 t
,判断它们是否是同构的。
如果 s
中的字符可以按某种映射关系替换得到t
,那么这两个字符串是同构的。
每个出现的字符都应当映射到另一个字符,同时不改变字符的顺序。不同字符不能映射到同一个字符上
,相同字符只能映射到同一个字符上,字符可以映射到自己本身。
示例 1:
输入:s = "egg", t = "add"
输出:true
示例 2:
输入:s = "foo", t = "bar"
输出:false
示例 3:
输入:s = "paper", t = "title"
输出:true
提示:
- 1 <= s.length <= 5 * 10^4
- t.length == s.length
- s 和 t 由任意有效的 ASCII 字符组成
解题思路
思路与290
题一样,用map
看看s
中的每个字符与t
中的每个字符是否有映射关系,但要注意不同字符不能映射到同一个字符上
,所以要双向映射
。比如a
对应c
后,b
就不能对应c
了,也就是c
对应a
后,就不能再对应b
,考虑到这种情况,所以需要双向check
,如下实例应返回false
“abba”
“cccc”
Go代码
func isIsomorphic(s string, t string) bool {
// 思路与290题一样,用map看看s中的每个字符与t中的每个字符是否有映射关系
//长度都不相等,肯定不符合题目要求的双向对应规律
if len(s) != len(t) {
return false
}
/* a对应c后,b就不能对应c了,考虑到这种情况,所以需要双向check,如下实例应返回false
"abba"
"cccc" */
return checkIsomorphic(s,t) && checkIsomorphic(t,s)
}
func checkIsomorphic(a,b string) bool {
helpMap := make(map[byte]byte)
for i := 0; i < len(a);i++ {
if val,ok := helpMap[a[i]];ok {
if val != b[i] {
return false
}
} else {
helpMap[a[i]] = b[i]
}
}
return true
}