目录
1,题目-同构字符串
给定两个字符串 s
和 t
,判断它们是否是同构的。
如果 s
中的字符可以按某种映射关系替换得到 t
,那么这两个字符串是同构的。
每个出现的字符都应当映射到另一个字符,同时不改变字符的顺序。不同字符不能映射到同一个字符上,相同字符只能映射到同一个字符上,字符可以映射到自己本身。
2,代码
/**
* @param {string} s
* @param {string} t
* @return {boolean}
*/
var isIsomorphic = function(s, t) {
const s2t={};
const t2s={};
const len = s.length;
for(let i=0;i<len;i++){
const x = s[i],y= t[i];
if((s2t[x] && s2t[x] != y) || (t2s[y] && t2s[y]!=x)){
return false;
}
//将映射关系加入 构造哈希表 属性名称和属性值
s2t[x] =y;
t2s[y]=x;
}
return true;
};
3,学习与总结
3.1 js中的对象
var myObject = {
key1: value1,
key2: value2,
// 更多键值对...
};
for(let i=0;i<len;i++){
const x = s[i],y= t[i];
if((s2t[x] && s2t[x] != y) || (t2s[y] && t2s[y]!=x)){
return false;
}
}
if ((s2t[x] && s2t[x] !== y) || (t2s[y] && t2s[y] !== x))
:这行代码是核心逻辑。它检查两个条件:
s2t[x] && s2t[x] !== y
:如果s
到t
的映射中已经存在映射x
且x
映射的不是y
,则说明存在矛盾,s
和t
不是同构的。t2s[y] && t2s[y] !== x
:如果t
到s
的映射中已经存在映射y
且y
映射的不是x
,同样说明存在矛盾,s
和t
不是同构的。如果任何一个条件为真,函数立即返回
false
。
3.2 数学概念中的映射与集合
设集合 s , t 中的某字符为 x , y ,
单射:对于任意 x ,都有唯一的 y 与之对应。
满射:对于任意 y ,至少存在一个 x 与之对应。
双射:既是单射又是满射,又称为一一对应。
作者:Krahets
链接:https://leetcode.cn/problems/isomorphic-strings/solutions/1645867/by-jyd-i4wt/
3.3题目分析回顾
- 需要判断s 和t中每个位置上的字符是否存在一一对应的关系;
- 即s的任意一个字符被t这唯一一个字符对应,同时t中任意一个字符被s中唯一一个字符对应;
- 维护两个哈希表,第一张哈希表s2t以s中字符为键,映射到t的字符为值;第一张哈希表t2s以t中字符为键,映射到s的字符为值;
3.4收获
- js中对象的使用:键是否存在,键值是否符合要求;
- 映射关系的代码实现;
告诉自己:贵在坚持!
最近每天第一件事情就是打卡力扣,马上就坚持一个星期啦!进度上也慢慢开始接触到哈希表,栈等数据结构了,坚持!