这是我参与11月更文挑战的第13天,活动详情查看:2021最后一次更文挑战。
题目描述:
205. 同构字符串 - 力扣(LeetCode) (leetcode-cn.com)
给定两个字符串 s 和 t,判断它们是否是同构的。
如果 s 中的字符可以按某种映射关系替换得到 t ,那么这两个字符串是同构的。
每个出现的字符都应当映射到另一个字符,同时不改变字符的顺序。不同字符不能映射到同一个字符上,相同字符只能映射到同一个字符上,字符可以映射到自己本身。
示例一
输入: s = "egg", t = "add"
输出: true
示例二
输入: s = "foo", t = "bar"
输出: false
示例三
输入: s = "paper", t = "title"
输出: true
提示:
- 可以假设
s和t长度相同。
思路分析
哈希表
理解题目意思,同构,即同一个字符只能映射为另一个字符,这里就要注意了,s中的字符在t中有唯一对应的,同理,t中每个字符在s中也有对应的,并且对应关系是一样的。
提到映射,自然就想到哈希表了。
我们维护2个哈希表,第一张表中可以记录 s 中的字符对应的关系,key 为字符,value 为 t 中对应的字符。
第二张表中则发过来,以 t 中字符为 key,s 中对应的字符为 value。
我们遍历2个字符,同时更新哈希表,如果出现映射关系冲突即不是同构字符串,反之则是。
AC代码
class Solution {
fun isIsomorphic(s: String, t: String): Boolean {
val m1 = mutableMapOf<Char, Char>()
val m2 = mutableMapOf<Char, Char>()
for(i in 0..s.lastIndex) {
val x = s[i]
val y = t[i]
if((m1.containsKey(x) && m1[x] != y) || (m2.containsKey(y) && m2[y] != x)) {
return false
}
m1.put(x, y)
m2.put(y, x)
}
return true
}
}
总结
理解题意是关键,同时注意下双射关系就行,剩下的就是简单的哈希表的运用。