LeetCode笔记:同构字符串
问题
给定两个字符串 s 和 t ,判断它们是否是同构的。
如果 s 中的字符可以按某种映射关系替换得到 t ,那么这两个字符串是同构的。
每个出现的字符都应当映射到另一个字符,同时不改变字符的顺序。不同字符不能映射到同一个字符上,相同字符只能映射到同一个字符上,字符可以映射到自己本身。
示例 1:
输入: s =
"egg",
t ="add"
输出: true
示例 2:
输入: s =
"foo",
t ="bar"
输出: false
示例 3:
输入: s =
"paper",
t ="title"
输出: true
提示:
- 可以假设 s 和 t 长度相同。
解法
思路:
观察同构字符串,能够得出两个规律:
- 如果两边的字符串都是新出现的,则满足同构的条件
- 如果有重复出现的字符串,则需要保证重复出现字符串和之前出现的元素一致
具体步骤是
- 定义两个对象,在遍历字符串的时候,将每一个字符串做一个
s => t
和t => s
的映射 - 重点就是判断当字符串重复出现的时候,是否还能保持之前的映射关系,当然,如果是新出现的,也是满足条件的
代码:
/**
* @param {string} s
* @param {string} t
* @return {boolean}
*/
var isIsomorphic = function (s, t) {
// 存储每个字符串,用作对比
const sObj = {},
tObj = {};
for (let i = 0; i < s.length; i++) {
// 取出每一个字符串
const x = s[i],
y = t[i];
// 如果是第一次出现的字符,就存储下来,如果最终发现所有的字符串都是第一次出现,则是同构字符串
// 如果之前出现过的字符,就要判断xy是不是互为映射,只要有一个不是映射,就不是同构字符串了
if ((sObj[x] && sObj[x] !== y) || (tObj[y] && tObj[y] !== x)) {
return false;
}
// 将第一次出现的字符串存储起来
sObj[x] = y;
tObj[y] = x;
}
return true;
};
评论