【leetcode】哈希OJ题,383赎金信/202快乐数/242有效的字母异位词
这几道哈希的题目,其用到的思想适用于很多可以用哈希来解决的题目。
383. 赎金信
题目
给你两个字符串:ransomNote
和 magazine
,判断 ransomNote
能不能由 magazine
里面的字符构成。
如果可以,返回 true
;否则返回 false
。
magazine
中的每个字符只能在 ransomNote
中使用一次。
1 | 示例 1: |
1 <= ransomNote.length, magazine.length <= 105
ransomNote
和magazine
由小写英文字母组成
思路和代码
因为给出的两个字符串里面都只包含小写的英文字母,所以我们用不上unordered_map
,只需要用一个26长度的int数组就可以了。
- 26长度的int数组,全部初始化为0;
- 遍历,记录magazine中每一个字符出现的次数;
- 遍历ransomNote字符串,将magazine中对应字符计数器减一;
- 如果某个计数器减至负数,则说明magazine中的字符不够用,返回false;
- 如果遍历完毕没有出现问题,则返回true;
代码如下
1 | class Solution { |
202. 快乐数
题目
编写一个算法来判断一个数 n
是不是快乐数。
「快乐数」 定义为:
- 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
- 然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。
- 如果这个过程 结果为 1,那么这个数就是快乐数。
如果 n
是 快乐数 就返回 true
;不是,则返回 false
。
1 | 示例 1: |
1 <= n <= 231 - 1
思路
这道题其实是个数学题,用到哈希的地方是判断之前出现的结果是否已经出现过了。题目中提到“然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1”,即可能会有用例,到最后计算的结果出现无限循环。
此时就需要用哈希来判断某一个结果是否已经出现过,如果出现过,第二次出现的时候就说明重复了,返回false退出循环计算即可。
代码如下
1 | class Solution { |
242. 有效的字母异位词
题目
给定两个字符串 *s*
和 *t*
,编写一个函数来判断 *t*
是否是 *s*
的字母异位词。
注意:若 *s*
和 *t*
中每个字符出现的次数都相同,则称 *s*
和 *t*
互为字母异位词。
示例 1:
1 | 输入: s = "anagram", t = "nagaram" |
示例 2:
1 | 输入: s = "rat", t = "car" |
提示:
1 <= s.length, t.length <= 5 * 104
s
和t
仅包含小写字母
思路
字母异位词就是两个字符串中所有字符出现的次数都相同,如果有不同的就不是字母异位词。
可以用两种思路来解决
- 对字符串排序,字母异位词排序后的结果肯定相同
- 使用哈希计算每个字符出现的次数,比较两个字符串中每个字符出现的次数是否相同,不相同则出现错误
这里采用哈希的思路,代码如下
1 | class Solution { |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 慕雪的寒舍!
评论