给定两个字符串 s
和 t
,判断它们是否是同构的。
如果 s
中的字符可以按某种映射关系替换得到 t
,那么这两个字符串是同构的。
每个出现的字符都应当映射到另一个字符,同时不改变字符的顺序。不同字符不能映射到同一个字符上,相同字符只能映射到同一个字符上,字符可以映射到自己本身。
输入:s = "egg", t = "add"
输出:true
输入:s = "foo", t = "bar"
输出:false
输入:s = "paper", t = "title"
输出:true
提示:
- 你可以想象成有两个柜子,分别是:
indexOfS
和indexOfT
- 每个柜子有很多层抽屉,那么比如
egg
和add
,第一个字符的抽屉,分别是e
和a
,由于是第一个字符,上一次的抽屉中的值是0,是满足条件的。并且在抽屉中存入i+1
标签,也就是1 - 当来到第二个字符的
g
和d
,也是满足条件的,因为第二个字符的抽屉中没有记录,并在抽屉中存入i+1
,也就是2 - 当来到第三个字符的
g
和d
,其实也是满足的,虽然第二个字符的抽屉中有记录,但是两个柜子的第二个字符的抽屉中的记录是一样的,因此,也更新i+1
,假如不一样,那么就返回false
。
let isIsomorphic = (s, t) => {
let indexOfS = [];
let indexOfT = [];
for (let i = 0; i < s.length; i++) {
if (indexOfS[s[i]] !== indexOfT[t[i]]) {
return false;
}
indexOfS[s[i]] = i + 1;
indexOfT[t[i]] = i + 1;
}
return true;
};
console.log(isIsomorphic("egg", "add"));
console.log(isIsomorphic("foo", "bar"));
console.log(isIsomorphic("paper", "title"));
func isIsomorphic(s, t string) bool {
indexOfS := make([]int, 256)
indexOfT := make([]int, 256)
for i := 0; i < len(s); i++ {
if indexOfS[s[i]] != indexOfT[t[i]] {
return false
}
indexOfS[s[i]] = i + 1
indexOfT[t[i]] = i + 1
}
return true
}
class Solution {
public boolean isIsomorphic(String s, String t) {
int[] indexOfS = new int[256];
int[] indexOfT = new int[256];
for (int i = 0; i < s.length(); i++) {
char sc = s.charAt(i), tc = t.charAt(i);
if (indexOfS[sc] != indexOfT[tc]) {
return false;
}
indexOfS[sc] = i + 1;
indexOfT[tc] = i + 1;
}
return true;
}
}