思路:哈希表
这里用了两个哈希表。至于为什么,且看下面的思路:
首先我们的题目要求我们每一个字母映射一个对应的字母,并且每个字母映射的字母不能一样,也就是严格的一一对应。
关于映射,自然就会想到用哈希表来存储用。但是,我们要知道,哈希表的区分只是对于键的去重,而和元素的去重没有关系,所以我们开始在尝试直接用哈希表映射的时候,不同的字母可以映射一样的字母,这是和题目要求不匹配的。
所以我们需要考虑被映射的字母怎么处理。一般的处理方法就是做上标记,让程序知道这个字母已经被别的字母映射过了。所以我们可以再创建一个哈希表用来标记这个字母的状态。
注意:这里说的字母是不仅仅包括26个字母,大家不要误会。有人会想到用数组来标记,很显然不合理。用数组的话你需要开一个能包括所有ASCII码的数组大小,这对于空间开销有点大了,所以用哈希表会合算一点。
还有一点就是,我们被标记的字母,再次遍历到有字母要映射它时,是不会放到哈希表里面去的,除了判断映射的字母是否和t字符串中的字符一致以外,还需要判断这个字符是否存在这个哈希表映射中。
class Solution {public boolean isIsomorphic(String s, String t) {if(s.length()!=t.length())return false;Map<Character,Character>m=new HashMap<>();Map<Character,Integer>count=new HashMap<>();for(int i=0;i<s.length();i++){if(!count.containsKey(t.charAt(i))){count.put(t.charAt(i),1);m.put(s.charAt(i),t.charAt(i));}}for(int i=0;i<s.length();i++){if(!m.containsKey(s.charAt(i))||m.get(s.charAt(i))!=t.charAt(i)){return false;}}return true;}
}