Question
Given two strings s and t, determine if they are isomorphic.
Two strings are isomorphic if the characters in s can be replaced to get t.
All occurrences of a character must be replaced with another character while preserving the order of characters. No two characters may map to the same character but a character may map to itself.
Example
Given “egg”, “add”, return true.
Given “foo”, “bar”, return false.
Given “paper”, “title”, return true.
Note
You may assume both s and t have the same length.
Java Code
//版本一:使用HashMap存储字符之间的映射关系
public boolean isIsomorphic(String s, String t) {
int len = s.length();
if(len < 2) return true;
//把<s, t>作为键值对存入HashMap中
HashMap<Character, Character> map = new HashMap<>(2*len);
//字符串转字符数组
char[] sKey = s.toCharArray();
char[] tValue = t.toCharArray();
for (int i = 0; i < len; i++) {
if(map.containsKey(sKey[i])) {
//如果map中已经存在当前字符sKey[i]且其映射的字符与当前tValue[i]不同,返回假
if(tValue[i] != map.get(sKey[i]))
return false;
}else {
//如果map中不存在当前字符sKey[i]但已经有其他的键映射到当前的值tValue[i],返回假
if(map.containsValue(tValue[i]))
return false;
//如果map中不存在当前的键值对<sKey[i], tValue[i]>,则存入
map.put(sKey[i], tValue[i]);
}
}
return true;
}
//版本二:使用数组记录原字符和映射字符的状态并存储字符之间的映射关系
public boolean isIsomorphic(String s, String t) {
boolean [] key = new boolean[128];//默认初始化为false,用于标记各个key是否存在
boolean[] value = new boolean[128];//默认初始化为false,用于标记各个value是否存在
int[] map = new int[128];//默认初始化为0
char[] sKey = s.toCharArray();
char[] tValue = t.toCharArray();
char ss, tt;
for(int i = s.length() - 1; i >= 0; --i) {
ss = sKey[i];
tt = tValue[i];
if(key[ss]) {
//如果ss在s中已经出现过且之前映射的字符与当前映射的字符tt不同,返回假
if(map[ss] != tt) return false;
}else {
//如果ss在s中未出现过但已有其他key映射到了tt,返回假
if(value[tt]) return false;
//否则标记key和value,并存储它们之间的映射关系
key[ss] = true;
value[tt] = true;
map[ss] = tt;
}
}
return true;
}