机试打卡 -06 异位词分组(哈希表)

这篇具有很好参考价值的文章主要介绍了机试打卡 -06 异位词分组(哈希表)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

机试打卡 -06 异位词分组(哈希表)

机试打卡 -06 异位词分组(哈希表) 机试打卡 -06 异位词分组(哈希表)


最容易想到的是利用 ord( ) 函数,按照字母计数的特征归类,代码如下:

class Solution:
    def groupAnagrams(self, strs: List[str]) -> List[List[str]]:

        ans_list=[]
        
        # 哈希表 {word_count:ans_list中的索引}
        word_count_dict=dict()

        # 遍历str
        for word in strs:

            # word 对应的字母计数元组
            word_count=self.Count_letters(word)
            
            # 若计数元组之前出现,则直接将word根据value值添加到ans_list中
            if word_count in word_count_dict:
                ans_list[word_count_dict[word_count]].append(word)

            # 若未出现,则将添加至哈希表,value值为len(ans_list)
            # 再将 [word] 添加至 ans_list 的末尾
            else:
                word_count_dict[word_count]=len(ans_list)
                ans_list.append([word])
        
        return ans_list


    def Count_letters(self,word):
        lst=[0]*26

        for letter in word:
            lst[ord(letter)-97]+=1
        
        # 此处必须转化成tuple元组
        #因为字典的key必须是可哈希的(即保持不变的--tuple)

        return tuple(lst)

①ord('a')==97。

②字典的key必须是可哈希的!

一个对象在其生命周期内,如果保持不变,就是hashable(可哈希的)。

hashable ≈ imutable     可哈希 ≈ 不可变

在Python中:

list、set和dictionary 都是可改变的,比如可以通过list.append(),set.remove(),dict[‘key‘] = value对其进行修改,所以它们都是不可哈希的;

而tuple和string是不可变的,只可以做复制或者切片等操作,所以它们就是可哈希的。

所以此处需要将 list转换为tuple 作为字典的key。


官方题解 方法一:排序

class Solution:
    def groupAnagrams(self, strs: List[str]) -> List[List[str]]:

        # 构建哈希表 {排序后的st:[]}    collections模块
        mp = collections.defaultdict(list)

        for st in strs:
            
            # sorted排序完成之后返回列表
            # "".join(list) 重新组合成字符串
            key = "".join(sorted(st))

            # 添加至对应value中
            mp[key].append(st)
        
        # 利用 dict.values() 方法
        #再用list()转换数据类型,直接返回结果列表

        return list(mp.values())

①sorted() 函数将返回一个排序后的列表,若需要重新组合成字符串,需使用 "".join()函数。

②dict.values() 将字典中的所有 value 全部取出,但需要使再用 list() 或 tuple() 转换数据类型;

dict.keys() 同理。


官方题解 方法二:计数

class Solution:
    def groupAnagrams(self, strs: List[str]) -> List[List[str]]:
        mp = collections.defaultdict(list)

        for st in strs:
            counts = [0] * 26
            for ch in st:
                counts[ord(ch) - ord("a")] += 1

            # 需要将 list 转换成 tuple 才能进行哈希
            mp[tuple(counts)].append(st)
        
        return list(mp.values())

 文章来源地址https://www.toymoban.com/news/detail-458495.html

到了这里,关于机试打卡 -06 异位词分组(哈希表)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • python字母异位词分组

    给你一个字符串数组,请你将  字母异位词  组合在一起。可以按任意顺序返回结果列表。 字母异位词  是由重新排列源单词的所有字母得到的一个新单词。 示例 1: 示例 2: 示例 3: 提示: 1 = strs.length = 104 0 = strs[i].length = 100 strs[i]  仅包含小写字母  

    2024年01月21日
    浏览(40)
  • 【算法题】49. 字母异位词分组

    给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。 字母异位词 是由重新排列源单词的所有字母得到的一个新单词。 示例 1: 输入: strs = [\\\"eat\\\", \\\"tea\\\", \\\"tan\\\", \\\"ate\\\", \\\"nat\\\", \\\"bat\\\"] 输出: [[\\\"bat\\\"],[\\\"nat\\\",\\\"tan\\\"],[\\\"ate\\\",\\\"eat\\\",\\\"tea\\\"]] 示例 2: 输入: strs = [\\\"\\\"] 输出:

    2024年01月22日
    浏览(36)
  • hot100:02字母异位分组

    题目链接: 力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 算法思想: 异位词: 字母异位词是由重新排列源单词的所有字母得到的一个新单词,说白了就是按照字母排序之后是同一个单词(如\\\"ate\\\" 和:\\\"eta\\\") 根据异位词的概念可以实现相应的算法,首先遍历整个字符串数

    2024年01月20日
    浏览(44)
  • 【LeetCode】49.字母异位词分组

    给你一个字符串数组,请你将  字母异位词  组合在一起。可以按任意顺序返回结果列表。 字母异位词  是由重新排列源单词的所有字母得到的一个新单词。 示例 1: 示例 2: 示例 3: 提示: 1 = strs.length = 10^4 0 = strs[i].length = 100 strs[i]  仅包含小写字母 字母异位词包含的字母种

    2024年02月15日
    浏览(42)
  • leetcode热题100. 字母异位词分组

    Problem: 49. 字母异位词分组 给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。 字母异位词 是由重新排列源单词的所有字母得到的一个新单词。 示例 1: 输入: strs = [“eat”, “tea”, “tan”, “ate”, “nat”, “bat”] 输出: [[“bat”],[“nat”

    2024年02月19日
    浏览(38)
  • LeetCode 49题: 字母异位词分组

    给你一个字符串数组,请你将  字母异位词  组合在一起。可以按任意顺序返回结果列表。 字母异位词  是由重新排列源单词的所有字母得到的一个新单词。 示例 1: 示例 2: 示例 3: 提示: 1 = strs.length = 104 0 = strs[i].length = 100 strs[i]  仅包含小写字母

    2024年02月09日
    浏览(36)
  • golang每日一题(字母异位词分组)

    给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。字母异位词 是由重新排列源单词的所有字母得到的一个新单词。 示例 1: 提示:    其实这道题从另一个思路来看,问题就迎刃而解了,找出每组字母相同并且字母个数也相同的元素,例

    2024年04月12日
    浏览(45)
  • 438. 找到字符串中所有字母异位词【异位词-哈希数组】

    438. 找到字符串中所有字母异位词 给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。 异位词 指由相同字母重排列形成的字符串(包括相同的字符串)。 示例 1: 输入: s = “cbaebabacd”, p = “abc” 输出: [0,6] 解释: 起

    2023年04月27日
    浏览(36)
  • 力扣:49. 字母异位词分组(Python3)

    给你一个字符串数组,请你将  字母异位词  组合在一起。可以按任意顺序返回结果列表。 字母异位词  是由重新排列源单词的所有字母得到的一个新单词。 来源:力扣(LeetCode) 链接:力扣 示例 1: 输入:strs = [\\\"eat\\\", \\\"tea\\\", \\\"tan\\\", \\\"ate\\\", \\\"nat\\\", \\\"bat\\\"] 输出:[[\\\"bat\\\"],[\\\"nat\\\",\\\"tan\\\"],[\\\"

    2024年02月14日
    浏览(36)
  • leetcode-49.字母异位词分组-day20

           

    2024年02月10日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包