描述
给定两个字符串 s
和 t
,判断它们是否是同构的。
如果 s
中的字符可以按某种映射关系替换得到 t
,那么这两个字符串是同构的。
每个出现的字符都应当映射到另一个字符,同时不改变字符的顺序。不同字符不能映射到同一个字符上,相同字符只能映射到同一个字符上,字符可以映射到自己本身。
提示:
1 <= s.length <= 5 * 104
t.length == s.length
s
和t
由任意有效的 ASCII 字符组成
示例
示例 1:
输入:s ="egg"
, t ="add"
输出:true
示例 2:
输入:s ="foo"
, t ="bar"
输出:false
示例 3:
输入:s ="paper"
, t ="title"
输出:true
算法思路1
哈希表存的是映射关系,哈希表用法详见Java“集合与列表”知识速成笔记学完就去实战(三)-CSDN博客
答案1
class Solution {
public boolean isIsomorphic(String s, String t) {
Map<Character,Character> s_t =new HashMap<>();
Map<Character,Character> t_s =new HashMap<>();
for(int i=0;i<s.length();i++){
if(s_t.containsKey(s.charAt(i))&&s_t.get(s.charAt(i))!=t.charAt(i)||t_s.containsKey(t.charAt(i))&&t_s.get(t.charAt(i))!=s.charAt(i)){
return false;
}
s_t.put(s.charAt(i),t.charAt(i));
t_s.put(t.charAt(i),s.charAt(i));
}
return true;
}
}
详解1
-
定义映射关系:
- 使用Java的
Map
接口实现类HashMap
创建了两个哈希表s2t
和t2s
。s2t
用于存储从字符串s
到字符串t
的字符映射关系,而t2s
用于存储从字符串t
到字符串s
的映射关系。这两个映射确保了字符之间的一一对应关系。
- 使用Java的
-
遍历字符串:
- 方法首先通过
s.length()
获取字符串s
的长度,该长度同样适用于字符串t
,因为同构的字符串必然长度相同。然后,使用一个循环遍历从0到len - 1
的所有索引。
- 方法首先通过
-
字符映射校验:
- 在每次迭代中,通过
charAt(i)
方法分别从s
和t
中取出对应位置的字符x
和y
。 - 然后,代码检查
x
到y
的映射是否已经存在于s2t
中,同时y
到x
的映射是否存在于t2s
中。如果存在任一映射但不符合当前字符对x
和y
的映射关系(即s2t.get(x) != y
或t2s.get(y) != x
),则说明s
和t
不是同构的,方法返回false
。
- 在每次迭代中,通过
-
更新映射关系:
- 如果当前字符对
x
和y
符合映射关系(或者是首次出现的映射),则使用put
方法将这对映射关系添加到HashMap
中,s2t.put(x, y)
将x
映射到y
,而t2s.put(y, x)
将y
映射到x
。
- 如果当前字符对
-
返回结果:
- 如果遍历完毕没有发现不符合条件的映射关系,说明每个字符都能在另一个字符串中找到一一对应的映射,没有违反同构的规则,因此最终方法返回
true
- 如果遍历完毕没有发现不符合条件的映射关系,说明每个字符都能在另一个字符串中找到一一对应的映射,没有违反同构的规则,因此最终方法返回