leetcode——哈希表:有效的字母异位词

218 阅读2分钟

242. 有效的字母异位词

给定两个字符串s和t,编写一个函数来判断t是否是s的字母异位词。
注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。
输入: s = "anagram", t = "nagaram"
输出: true

思路:先遍历第一个存入哈希表,在遍历第二个删除,元素都是0就相同
image.png
这题其实就是一个简单数组(数组就是一个最简单的哈希表),还没用到复杂的哈希表。注意这里0和1 代表了false和true

383. 赎金信

给你两个字符串:ransomNote 和 magazine ,判断 ransomNote 能不能由 magazine 里面的字符构成。
如果可以,返回 true ;否则返回 false 。
magazine 中的每个字符只能在 ransomNote 中使用一次。
输入: ransomNote = "aa", magazine = "aab"
输出: true

个人思路:其实就是a是b的子集。和上一题目相似,判断true结果的标准是hashmap[i.charCodeAt() - base] <= 0

49. 字母异位词分组

给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
字母异位词 是由重新排列源单词的字母得到的一个新单词,所有源单词中的字母通常恰好只用一次。

输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
输出: [["bat"],["nat","tan"],["ate","eat","tea"]]。

思路:其实挺简单的,用map来做。
1. 定义map存储
2. 字符串转数组->排序->转字符串为key(将所有异位词排序为同一单词,作为key)
3. 根据key插入map
4. map传数组输出

map.values()是一个伪数组,可以用Array.from(伪数组)变成真数组。

438. 找到字符串中所有字母异位词

给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。
异位词 指由相同字母重排列形成的字符串(包括相同的字符串)。

输入: s = "cbaebabacd", p = "abc"
输出: [0,6]
解释:
起始索引等于 0 的子串是 "cba", 它是 "abc" 的异位词。
起始索引等于 6 的子串是 "bac", 它是 "abc" 的异位词。

个人思路:双指针+map,首先p.split("").sort.join("")化作key值,slow指向首元素,fast指向slow+p.length-1位置元素,把这区间元素对比如果等于key就push进去slow指针。然后遍历,终止条件是fast+1=null。这个思路时间复杂度很高,主要是因为每个字符串都是按顺序打开再拼接(字符串长了时间复杂度就会很高)

总体思路,先统计p中所需字符的个数,放入need,用Map存储。
滑动窗口遍历s,若窗口中的字符串满足need中的数量,则将左指针放入res。
判断满足条件的标准:窗口中字符串的有效字符数 === need的大小
判断是有效字符:窗口中出现该字符的个数 === need中出现该字符的个数
先移动fast指针,直到fast-slow>=p.length,开始考虑slow指针,如果符合先存入,然后移动slow指针并考虑情况。