给定两个字符串 s 和 t,判断它们是否是同构的。
如果 s 中的字符可以被替换得到 t ,那么这两个字符串是同构的。
所有出现的字符都必须用另一个字符替换,同时保留字符的顺序。两个字符不能映射到同一个字符上,但字符可以映射自己本身。
示例 1:
输入: s = "egg", t = "add" 输出: true
示例 2:
输入: s = "foo", t = "bar" 输出: false
示例 3:
输入: s = "paper", t = "title" 输出: true
说明:
你可以假设 s 和 t 具有相同的长度。
解法:
我们可以利用一个 map 来处理映射。对于 s 到 t 的映射,我们同时遍历 s 和 t ,假设当前遇到的字母分别是 c1 和 c2 。 如果 map[c1] 不存在,那么就将 c1 映射到 c2 ,即 map[c1] = c2。 如果 map[c1] 存在,那么就判断 map[c1] 是否等于 c2,也就是验证之前的映射和当前的字母是否相同。 对于这道题,我们只需要验证 s - > t 和 t -> s 两个方向即可。如果验证一个方向,是不可以的。 举个例子,s = ab, t = cc,如果单看 s -> t ,那么 a -> c, b -> c 是没有问题的。 必须再验证 t -> s,此时,c -> a, c -> b,一个字母对应了多个字母,所以不是同构的。 代码的话,只需要调用两次上边的代码即可。
1 public boolean isIsomorphic(String s, String t) { 2 return isIsomorphicTest(s,t) && isIsomorphicTest(t,s); 3 } 4 5 public boolean isIsomorphicTest(String s, String t) { 6 Map<Character,Character> map = new HashMap<>(); 7 for(int i = 0;i < s.length();i ++){ 8 char a = s.charAt(i); 9 char b = t.charAt(i); 10 if(map.containsKey(a)){ 11 if(map.get(a)!=b){ 12 return false; 13 } 14 }else{ 15 map.put(a,b); 16 } 17 } 18 return true; 19 }
原文:https://www.cnblogs.com/0error0warning/p/13569985.html