思路1:遍历。遍历s和t。在s中取出所有两两组合的情况。如果s中碰到两个相同的字符,那么记下两个字符的下标。此时去t中比较相同两个下标的字符是否相等。如果不等,返回false;如果相等,继续遍历。此思路很容易想到,但是存在大量的重复计算。所以最后导致time limit exceeded。但是test cases是全部通过的。下面给出代码:
class Solution {
public boolean isIsomorphic(String s, String t) {
for(int i = 0; i < s.length() - 1; i++){
for(int j = i+1; j < s.length(); j++){
if(s.charAt(i) == s.charAt(j)){
if(t.charAt(i) != t.charAt(j)){return false;}
}else{
if(t.charAt(i) == t.charAt(j)){return false;}
}
}
}
return true;
}
}
思路2:使用hashmap,s作为key,t作为value。这是一个特殊的map,不仅仅需要key唯一,value也需要唯一。不能出现例如:ab->aa 这样的情况。满足以上的条件,则返回true。而且使用hashmap也可以避免大量的重复计算。这也是这个做法leetcode accept的原因。直接给上代码:
class Solution {
public boolean isIsomorphic(String s, String t) {
Map<Character,Character> mappings = new HashMap<>();
int i = 0;
int j= 0;
int len = s.length();
while(i < len && j < len){
if(mappings.containsKey(s.charAt(i))){
if(mappings.get(s.charAt(i)) != t.charAt(j)) {
return false;
}else{
i++;
j++;
}
}else{
if(mappings.containsValue(t.charAt(j))){
return false;
}else{
mappings.put(s.charAt(i),t.charAt(j));
i++;
j++;
}
}
}
return true;
}
}
总结:
- map中key唯一,value可以不唯一。可以多个key对应的value都是相同的。这也是为什么有get(key)但是没有get(value)的原因。就算如果有get(value)的话,那返回结果也应该是个list,因为key可以不止一个。