LeetCode 75——205. 同构字符串

102 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第1天,点击查看活动详情

LeetCode 75——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 * 104 t.length == s.length s 和 t 由任意有效的 ASCII 字符组成

来源:力扣(LeetCode)

链接:leetcode.cn/problems/is… 著作权归领扣网络所有。

商业转载请联系官方授权,非商业转载请注明出处。

二、思路分析:

  1. 这道题考察了什么思想?你的思路是什么?

    看到这道题,我的第一想法是使用map将字符串s与字符串t对应起来,但是假如就使用一个map的话,就会有部分测试点通不过,为什么呢?我们可以看示例2:

    输入:s = "foo", t = "bar"
    输出:false
    

    这里s中的o在t中有a和r两个映射,如果只有一个map,就会导致映射丢失。因此我们需要两个map,一个map以s中字符为键,映射t中对应的字符,另一个map以t中字符为键,映射s中的字符。

  2. 做题的时候是不是一次通过的,遇到了什么问题,需要注意什么细节?

    不是一次通过的,需要注意这里要使用两个map,不然就可能导致映射丢失!

  3. 有几种解法,哪种解法时间复杂度最低,哪种解法空间复杂度最低,最优解法是什么?其他人的题解是什么,谁的效率更好一些?用不同语言实现的话,哪个语言速度最快?

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

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

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

    private boolean isIsomorphicHelper(String s, String t) {
        int n = s.length();
        HashMap<Character, Character> map = new HashMap<>();
        for (int i = 0; i < n; i++) {
            char c1 = s.charAt(i);
            char c2 = s.charAt(i);
            if (map.containsKey(c1)) {
                if (map.get(c1) != c2) {
                    return false;
                }
            } else {
                map.put(c1, c2);
            }
        }
        return true;
    }
    作者:windliang
    链接:https://leetcode.cn/problems/isomorphic-strings/solution/xiang-xi-tong-su-de-si-lu-fen-xi-duo-jie-fa-by-42/
    来源:力扣(LeetCode)
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
    

三、AC 代码:

func isIsomorphic(s, t string) bool {
    s2t := make(map[byte]byte)
    t2s := make(map[byte]byte)
    for i := range s{
        x, y := s[i], t[i]
        if s2t[x] > 0 && s2t[x] != y || t2s[y] > 0 && t2s[y] != x{
            return false
        }
        t2s[y] = x
        s2t[x] = y
    }
    return true
}

四、总结:

这道题的关键词是[哈希表]和[字符串],注意byte和rune的区别,我们这里st 由任意有效的 ASCII 字符组成,所以用byte即可。

模板来源:

作者:掘金酱

链接:juejin.cn/post/706970…

来源:稀土掘金 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。