1. 同构字符串
思路1:
可以用哈希映射来做。将字符串s和t同时对比,假设当前遇到的字符分别是c1和c2,
看一下哈希映射里面是否有c1,如果有,则看一下c1和c2是否相对应,如果不对应,则返回false。
如果哈希映射里面没有c1,则将(c1,c2)加到哈希映射中。
注意:对于这道题,我们只需要验证 s - > t 和 t -> s 两个方向即可。如果验证一个方向,是不可以的。
举个例子,s = ab, t = cc,如果单看 s -> t ,那么 a -> c, b -> c 是没有问题的。
必须再验证 t -> s,此时,c -> a, c -> b,一个字母对应了多个字母,所以不是同构的
所以主函数中应该把两个字符串的两种顺序都判断一下。
上代码:
class Solution {
public boolean isIsomorphic(String s, String t) {
return yanzheng(s,t)&&yanzheng(t,s);
}
public boolean yanzheng(String s,String t){
Map<Character,Character> map=new HashMap<>();
for(int i=0;i<s.length();i++){
char c1=s.charAt(i);
char c2=t.charAt(i);
if(map.containsKey(c1)){
if(map.get(c1)!=c2)
return false;
}
else{
map.put(c1,c2);
}
}
return true;
}
}
思路2:
建立第三方对比机制,例如,一个汉语的人和一个说法语的人交流不畅,两个人可以把汉语翻译成英语,法语翻译成英语来进行交流,
所以,可以将字母换成按出场的顺序和次数换成数字,例如,add为122,egg为122,二者同构;
adddss是122233,stttqq是122233,二者同构。
上代码:
class Solution {
public boolean isIsomorphic(String s, String t) {
return yanzheng(s).equals(yanzheng(t));
}
public String yanzheng(String s){
int [] map=new int[128];
StringBuilder sb=new StringBuilder();
int count=1;
for(int i=0;i<s.length();i++){
char c=s.charAt(i);
if(map[c]==0){
map[c]=count;
count++;
}
sb.append(map[c]);
}
return sb.toString();
}
}