题目:
给定两个字符串 s 和 t,判断它们是否是同构的。
如果 s 中的字符可以被替换得到 t ,那么这两个字符串是同构的。
所有出现的字符都必须用另一个字符替换,同时保留字符的顺序。两个字符不能映射到同一个字符上,但字符可以映射自己本身。
示例 1:
输入: s = “egg”, t = “add”
输出: true
示例 2:
输入: s = “foo”, t = “bar”
输出: false
示例 3:
输入: s = “paper”, t = “title”
输出: true
说明:
你可以假设 s 和 t 具有相同的长度。
本题思路:一种思路是map建立映射关系,一个key对应一个value,但是需要注意的一个问题是对于这道题,我们需要验证 s - > t 和 t -> s 两个方向即可。如果验证一个方向,是不可以的。举个例子,s = ab, t = cc,如果单看 s -> t ,那么 a -> c, b -> c 是没有问题的。必须再验证 t -> s,此时,c -> a, c -> b,一个字母对应了多个字母,所以不是同构的。
代码:
public boolean isIsomorphic(String s, String t) {
return isIsomorphicHelper(s, t) && isIsomorphicHelper(t, s);
}
private boolean isIsomorphicHelper(String s, String t) {
int n = s.length();
HashMap<Character, Character> map = new HashMap<>();
for (int i = 0; i < n; i++) {
char c1 = s.charAt(i);
char c2 = t.charAt(i);
if (map.containsKey(c1)) {
if (map.get(c1) != c2) {//map中一定要加上泛型,不然会出错
return false;
}
} else {
map.put(c1, c2);
}
}
return true;
}
第二种解法:
public boolean isIsomorphic(String s, String t) {
int n = s.length();
int[] mapS = new int[128];
int[] mapT = new int[128];
for (int i = 0; i < n; i++) {
char c1 = s.charAt(i);
char c2 = t.charAt(i);
//当前的映射值是否相同
if (mapS[c1] != mapT[c2]) {
return false;
} else {
//是否已经修改过,修改过就不需要再处理
if (mapS[c1] == 0) {
mapS[c1] = i + 1;
mapT[c2] = i + 1;
}
}
}
return true;
}
我拿到这个题目的思路是:这道题是判断两个字符串是不是同构,也就说判断是不是同一种结构,所以我的想法是建立一个数组,用来记录字符串的结构,从1开始取当前位置字符串和前面的字符串进行比较,如果当前位置和前面位置有相同的字符,则把当前位置的值设为前面相同字符的位置(下标),如果前面字符没有与之相同的则设置为当前字符的下标;0位置默认为0。最后形成这个字符的结构数组,同理,生成第二个字符串的结构数组,最后在判断两个字符数组是否相等,相等则表示两个字符串是同一个结构,不相等的话则表示不是同一个结构return false。不过没有通过所有的测试案例,我也一直在思考问题出在哪里。。。。代码就不贴出来了,毕竟这个思路还没有ac。