LeetCode.205 同构字符串

244 阅读2分钟

这是我参与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 为字符,valuet 中对应的字符。

第二张表中则发过来,以 t 中字符为 keys 中对应的字符为 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
    }
}

总结

理解题意是关键,同时注意下双射关系就行,剩下的就是简单的哈希表的运用。

参考

同构字符串 - 同构字符串 - 力扣(LeetCode) (leetcode-cn.com)