持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第28天,点击查看活动详情
力扣205. 同构字符串
一、题目描述:
给定两个字符串 s 和 t ,判断它们是否是同构的。
如果 s 中的字符可以按某种映射关系替换得到 t ,那么这两个字符串是同构的。
每个出现的字符都应当映射到另一个字符,同时不改变字符的顺序。不同字符不能映射到同一个字符上,相同字符只能映射到同一个字符上,字符可以映射到自己本身。
示例 1:
输入:s = "egg", t = "add"
输出:true
示例 2:
输入:s = "foo", t = "bar"
输出:false
示例 3:
输入:s = "paper", t = "title"
输出:true
提示:
1 <= s.length <= 5 * 104
t.length == s.length
s 和 t 由任意有效的 ASCII 字符组成
来源:力扣(LeetCode) 链接:leetcode.cn/problems/is… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
二、思路分析:
这部分可以写写:
-
这道题考察了什么思想?你的思路是什么?
对于这道题目,我的思路十分简单,就是利用两张哈希表,一张哈希表把s中的字母作为key,把字符串t中对应的字母作为value。同样的,另一张哈希表将字符串t中的字母作为key,而把字符串s中的字母作为value。然后同时遍历两个字符串,在某一个下标,如若两个字符串中其中一个字母与另一个字母与对应哈希表的值不相等就表示无法重构。遍历结束仍没有出现冲突表示同构。
-
做题的时候是不是一次通过的,遇到了什么问题,需要注意什么细节?
是一次通过的,本题只需要有思路,就可以简单编写出本程序。
-
有几种解法,哪种解法时间复杂度最低,哪种解法空间复杂度最低,最优解法是什么?其他人的题解是什么,谁的效率更好一些?用不同语言实现的话,哪个语言速度最快?
const isIsomorphic = function (s, t) { <!-- 长度不相等直接返回false --> if (s.length != t.length) { return false; } <!-- 完全相等直接返回true --> if(s==t){ return true } <!-- 转化方法:'abcdd'=>'12344' --> const parse = function (data) { const arr = data.split(''); const keys = {} const filterArr = [...new Set(arr)] filterArr.forEach((item, index) => { keys[item] = '_'+index }); const sRes = arr .map((item) => { return keys[item]; }) .join(''); return sRes }; const sValue = parse(s); const tValue = parse(t); if(sValue==tValue){ return true } return false }; 作者:martin-wv 链接:https://leetcode.cn/problems/isomorphic-strings/solution/by-martin-wv-6fet/ 来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
三、AC 代码:
class Solution:
def isIsomorphic(self, s: str, t: str) -> bool:
if len(t) != len(s):
return False
s2t = {}
t2s = {}
for i in range(len(s)):
s_c, t_c = s[i], t[i]
if s_c not in s2t:
s2t[s_c] = t_c
if t_c not in t2s:
t2s[t_c] = s_c
if s2t[s_c] != t_c or t2s[t_c] != s_c:
return False
return True
四、总结:
如果你还有更多的思考、分析、总结,通通都加上来吧~
205. 同构字符串
这道题目的数学化归思想我感觉这个思路很好,这个思想一定要掌握啊!
写作模板来源
作者:掘金酱 链接:juejin.cn/post/706970… 来源:稀土掘金 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。