法1: 单哈希表
- 遍历s,如果sc不在map中,需要添加映射关系。(此时,要排除多对一的关系:例如:bacd,baba;此时b已经被b映射了,就不能再映射到d上 )
- 如果sc在map中,此时说明已经添加过映射关系了,此时取出当时的映射关系,如果与tc不相等,说明本次的映射关系错误
java
class Solution {
public boolean isIsomorphic(String s, String t) {
if(s.length() != t.length()) return false;
int n = s.length();
Map<Character, Character> map = new HashMap<>();
for(int i = 0;i< n ;i++){
char sc = s.charAt(i);
char tc = t.charAt(i);
if(!map.containsKey(sc)){
if(map.containsValue(tc)) return false;
map.put(sc, tc);
}else{
char tmp = map.get(sc);
if(tmp != tc) return false;
}
}
return true;
}
}
法2:官解:双数组字符映射
哈希表map.containsValue o(K) 还是有点耗时,采用两个数组分别记录映射关系。
java
class Solution {
public boolean isIsomorphic(String s, String t) {
if(s.length() != t.length()) return false;
int n = s.length();
int[] mapS = new int[256];
int[] mapT = new int[256];
for(int i = 0;i<n ;i++){
char c1 = s.charAt(i);
char c2 = t.charAt(i);
if(mapS[c1] != 0 && mapS[c1] != c2 ) return false;
if(mapT[c2] != 0 && mapT[c2] != c1 ) return false;
mapS[c1] = c2;
mapT[c2] = c1;
}
return true;
}
}