1. 给定两个字符串 s 和 t ,判断它们是否是同构的。
如果 s 中的字符可以按某种映射关系替换得到 t ,那么这两个字符串是同构的。
每个出现的字符都应当映射到另一个字符,同时不改变字符的顺序。不同字符不能映射到同一个字符上,相同字符只能映射到同一个字符上,字符可以映射到自己本身。
2. 我的解法
将两个字符串拆分成数组t1,s1。
循环检查,用map存储检查结果
1. 检查s1[i]为key是否存在后,再检查t1[i]为value是否存在。如果不存在,则存入map,t1[i]–s1[i]
2. 检查s1[i]对应的value是否与t1[i]相等,不相等则返回false
public static boolean isIsomorphic(String s, String t) {
if(s.length()!=t.length()){
return false;
}
String []s1=s.split("");
String[] t1=t.split("");
Map map1=new HashMap();
for(int i=0;i<s1.length;i++){
// 检测key是否存在
if(!map1.containsKey(s1[i])){
// 此处比较麻烦,遍历map检测value是否存在
Iterator<Map.Entry<String,String>> iterator = map1.entrySet().iterator();
while(iterator.hasNext()){
Map.Entry<String,String> item = iterator.next();
if(item.getValue().equals(t1[i])){
return false;
}
}
map1.put(s1[i],t1[i]);
}else{
if(!map1.get(s1[i]).equals(t1[i])){
return false;
}
}
}
return true;
}
3. 更佳解法
https://leetcode.cn/problems/isomorphic-strings/solution/tong-gou-zi-fu-chuan-by-leetcode-solutio-s6fd/
设置两张表,进行更新维护
public static boolean isIsomorphic2(String s, String t) {
Map <Character,Character>s2t=new HashMap<>();
Map<Character, Character> t2s=new HashMap<>();
for(int i=0;i<s.length();i++){
char x=s.charAt(i),y=t.charAt(i);
if(s2t.containsKey(x)&&s2t.get(x)!=y||
t2s.containsKey(y)&&t2s.get(y)!=x){
return false;
}
s2t.put(x,y);
t2s.put(y,x);
}
return true;
}
4. 备注
map遍历的方法
Iterator<Map.Entry<String,String>> iterator = map1.entrySet().iterator();
while(iterator.hasNext()){
Map.Entry<String,String> item = iterator.next();
System.out.println(item.getKey());
System.out.println(item.getValue());
}