hash表相关:有效的字母异位词、字母异位词分组、两数之和、数组的度

一、有效的字母异位词

题目:给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。

示例1:

输入: s = "anagram", t = "nagaram"
输出: true

示例2:

输入: s = "rat", t = "car"
输出: false

说明: 你可以假设字符串只包含小写字母。

1、排序
class Solution:
    def isAnagram(self, s: str, t: str) -> bool:
    	return sorted(s) == sorted(t)
2、常规办法:采用字典
class Solution:
    def isAnagram(self, s: str, t: str) -> bool:
        # 法1: 字典
        letter_dic = {}
        for i in s:
            letter_dic[i] = letter_dic.get(i,0) + 1
        for j in t:
            if j not in letter_dic:
                return False
            else:
                letter_dic[j] -= 1
                if letter_dic[j] == 0:
                    del letter_dic[j]
        return letter_dic == {}
3、优化字典法:采用defaultdict
class Solution:
    def isAnagram(self, s: str, t: str) -> bool:
        # 法2: defaultdict,可以指定value值的类型,如果为int类型,且会为每个key的value初始化为0
        tracker = collections.defaultdict(int)
        for x in s: tracker[x] += 1
        for x in t: tracker[x] -= 1
        # all() 函数用于判断给定的可迭代参数 iterable 中的所有元素是否都为 True,如果是返回 True,否则返回 False。
        return all(x == 0 for x in tracker.values())
        # 有趣的是x == 0 for x in tracker.values()这个得到的竟然是一个生成器对象!

二、字母异位词分组

题目:给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。

示例:

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

说明:

  • 所有输入均为小写字母。
  • 不考虑答案输出的顺序。
class Solution:
    def groupAnagrams(self, strs: List[str]) -> List[List[str]]:
        dic = {}
        for v in strs:
            sort_v = tuple(sorted(v))
            dic[sort_v] = dic.get(sort_v,[]) + [v]
        return list(dic.values())

三、两数之和

两层循环,暴力法破解,不说了!

1、字典法
class Solution(object):
    def twoSum(self, nums, target):
        a_dic = {v:i for i, v in enumerate(nums)}
        for i in range(len(nums)):
            a = target - nums[i]
            if a in a_dic and a_dic[a] != i:
                return [a_dic[a], i]
2、字典法优化
class Solution(object):
    def twoSum(self, nums, target):
    	# 一边遍历列表一边查字典
    	# 有人会疑惑,这样难道不会错过两数之和等于target的index吗?
    	# 不会,a + b = target,错过了a,a会被加入dic,那么b一定不会错过!
        dic = {}
        for i, v in enumerate(nums):
            num = target - v
            if num in dic:
                return [i, dic[num]]
            dic[v] = i

四、数组的度

在这里插入图片描述

class Solution:
    def findShortestSubArray(self, nums: List[int]) -> int:
        # 哈希表
        # [0,i,0]释义:[count, start, end]
        dic = {}
        for i, v in enumerate(nums):
            dic[v] = dic.get(v, [0,i,0])
            dic[v][0] += 1
            dic[v][2] = i
        max_Num, min_len = 0, math.inf
        for k, v in dic.items():
            l = v[2] - v[1] + 1
            if v[0] > max_Num:
                max_Num = v[0]
                min_len = l
            if v[0] == max_Num and l < min_len:
                min_len = l
        return min_len
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

凤求凰的博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值