leetcode 205.同构字符串
思路:哈希表
这里用了两个哈希表。至于为什么,且看下面的思路:
首先我们的题目要求我们每一个字母映射一个对应的字母,并且每个字母映射的字母不能一样,也就是严格的一一对应。
关于映射,自然就会想到用哈希表来存储用。但是,我们要知道,哈希表的区分只是对于键的去重,而和元素的去重没有关系,所以我们开始在尝试直接用哈希表映射的时候,不同的字母可以映射一样的字母,这是和题目要求不匹配的。
所以我们需要考虑被映射的字母怎么处理。一般的处理方法就是做上标记,让程序知道这个字母已经被别的字母映射过了。所以我们可以再创建一个哈希表用来标记这个字母的状态。
注意:这里说的字母是不仅仅包括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;
}
}