LeetCode#205. 同构字符串

107 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第7天,点击查看活动详情

1.描述

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 字符组成

2.分析

  1. 如果映射还没有建立map[chars1[i]] == 0,就创建映射map[chars1[i]] = chars2[i]。这个时候是对于字符串1中该字符的第一次替换
  2. 如果映射已经建立,就判断按照映射关系替换1中的字符,是否与字符串2对应的字符相同,如果不相同map[chars1[i]] != chars2[i]说明无法按照一一替换的原则完成,直接返回false。
  3. 如果遍历完成,说明以字符串1可以完成替换。

3.AC代码

 class Solution {
    public boolean isIsomorphic(String s, String t) {
        return canMap(s, t) && canMap(t, s);
    }

    private boolean canMap(String s, String t){
        int[] map = new int[128]; // ascii 128个字符
        char[] chars1 = s.toCharArray();
        char[] chars2 = t.toCharArray();
        for(int i = 0; i < chars1.length; i++){
            if(map[chars1[i]] == 0)
                map[chars1[i]] = chars2[i];
            else {
                if(map[chars1[i]] != chars2[i])
                    return false;
            }
        }
        return true;
    }
}

总结

思路还是很清晰的,就是利用哈希表建立联系,然后遍历对比即可。

参考

详细通俗的思路分析,多解法 - 同构字符串 - 力扣(LeetCode) (leetcode-cn.com)

「代码随想录」带你学透哈希法!【205. 同构字符串】 - 同构字符串 - 力扣(LeetCode) (leetcode-cn.com)