持续创作,加速成长!这是我参与「掘金日新计划 · 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… 著作权归领扣网络所有。
商业转载请联系官方授权,非商业转载请注明出处。
二、思路分析:
-
这道题考察了什么思想?你的思路是什么?
看到这道题,我的第一想法是使用map将字符串s与字符串t对应起来,但是假如就使用一个map的话,就会有部分测试点通不过,为什么呢?我们可以看示例2:
输入:s = "foo", t = "bar" 输出:false这里s中的o在t中有a和r两个映射,如果只有一个map,就会导致映射丢失。因此我们需要两个map,一个map以s中字符为键,映射t中对应的字符,另一个map以t中字符为键,映射s中的字符。
-
做题的时候是不是一次通过的,遇到了什么问题,需要注意什么细节?
不是一次通过的,需要注意这里要使用两个map,不然就可能导致映射丢失!
-
有几种解法,哪种解法时间复杂度最低,哪种解法空间复杂度最低,最优解法是什么?其他人的题解是什么,谁的效率更好一些?用不同语言实现的话,哪个语言速度最快?
我们可以利用一个 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的区别,我们这里s 和 t 由任意有效的 ASCII 字符组成,所以用byte即可。
模板来源:
作者:掘金酱
来源:稀土掘金 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。