思路:
由于题目规定字符顺序不可变,说明串与串之间的字符都是一一对应的,每一个映射关系可以出现多次,但必须相同,例如e->a,后面e->b或者b->a就不行了。
根据映射关系唯一,可通过下标来标识,如果两字符构成的映射关系所对应的下标相同则符合。
public boolean isIsomorphic(String s, String t) {
HashMap<Character,Integer> h1 = new HashMap<>();
HashMap<Character,Integer> h2 = new HashMap<>();
for(int i = 0; i < s.length(); i++) {
Integer a = h1.get(s.charAt(i));
Integer b = h2.get(t.charAt(i));
if(a == null && b == null) { //不存在该映射则添加
h1.put(s.charAt(i),i);
h2.put(t.charAt(i),i);
} else if(a != null && b != null) {// 存在则判断下标是否相同
if(!a.equals(b)) return false;
} else {
return false; //仅存在一个也不符合,即相同字符映射到了不同字符上
}
}
return true;
}
简化
public boolean isIsomorphic(String s, String t) {
HashMap<Character,Integer> h1 = new HashMap<>();
HashMap<Character,Integer> h2 = new HashMap<>();
for(int i = 0; i < s.length(); i++) {
Integer a = h1.get(s.charAt(i));
Integer b = h2.get(t.charAt(i));
if(a == null && b == null) { //不存在该映射则添加
h1.put(s.charAt(i),i);
h2.put(t.charAt(i),i);
}
if(a != b) return false; //对于unicode并不正确,!=会有常量池问题,用equals,不过需要判空
}
return true;
}
其它测试用例
"badc"
"baba"
"bbbaaaba"
"aaabbbba"