每日一题(2)——字母异位词分组

Leecode1 2024.3.12

2.字母异位词分组

给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。

字母异位词 是由重新排列源单词的所有字母得到的一个新单词。

示例 1:

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

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

示例 2:

输入: strs = [""]

输出: [[""]]

示例 3:

输入: strs = ["a"]

输出: [["a"]]

提示:

1 <= strs.length <= 104

0 <= strs[i].length <= 100

strs[i] 仅包含小写字母


个人第一次解答

class Solution:
    def groupAnagrams(self, strs: List[str]) -> List[List[str]]:
        output=[]
        check_list=[]
        for idx, string in enumerate(strs):
            same_list=[]
            same_list.append(string)
            if string in check_list:
                pass
            else:
                for j in range(idx+1, len(strs)):
                    if equal(strs[j], str(string)):
                        same_list.append(strs[j])
                        check_list.append(strs[j])
                output.append(same_list)
        return output

def equal(str1, str2):
    ls1 = list(str1)
    ls2 = list(str2)
    ls1.sort()
    ls2.sort()
    if ls1 == ls2:
        return True
    else:
        return False

思路:对字符串的操作不是很熟悉,所以就用简单的想法,所以自己写的时候就先按照传统的思路来了一遍,看上去写法还是很笨的。

1.定义了一个判断两个字符串所含字母是否满足定义的函数,这里查找了一下资料,说变成list再sort,但是其实string也是可以直接进行排序的,用sorted(string)就行;

2.循环,这里还是没有学会怎么巧妙的使用hash表来优化,所以暴力两次for循环,然后自以为巧妙的加了一下骚操作,结果运行的时候直接超时,寄了。过了大部分的案例,倒在了下面这个例子上:


哈希表优化

1.回顾一下昨天的两数之和,也是使用hash表优化的。key对应数组里的数字,value对应需要返回的下标,也是将两次循环变成一次循环加一次在hash表里的查找,找到的输出,没找到的加入哈希表;

2.记住这个核心思想:将两次循环变成一次循环加一次在hash表里的查找,找到的输出,没找到的输入,我们来优化上面写的代码:

(1)最开始没有想到怎么去构建hash表的key,后面参考了一些评论,发现可以使用排好序的string作为key,其他所有符合定义的,在原list里的string作为value;

(2)判断是否符合定义也就不需要新定义函数了,只需要 "".join(sorted(s)) in dic就可以判断是否符合;

最后的代码如下:

class Solution:
    def groupAnagrams(self, strs: List[str]) -> List[List[str]]:
        dic={}
        for s in strs:
            keys = "".joint(sorted(s))
            if keys in dic:
                dic[keys] = s
            else:
                dic[keys].append(s)
        return list[dic.values()]

优雅!

耗时:47ms(84.47%)

内存:19.3MB(81.75%)


一些知识点

1.sort和sorted

sort 是列表(list)对象的一个方法,用于对列表进行原地排序,这意味着它直接修改原列表,而不返回任何值(实际上返回 None)。
sorted 是Python的内置函数,可以对任何可迭代的对象进行排序,包括但不限于列表、元组、字典和字符串,返回一个新的排序列表,原始数据不会被修改。

2.joint

语法:“sep”.joint(seq)

sep: 代表分隔符, 可以是单个字符如: , . - ; 等,也可以是字符串如: ‘abc’。

seq: 代表要连接的元素序列,可以是字符串、元组、列表、字典等。

注:'sep’和seq都只能是string型,不能是int型和float型。

作用:将seq中的元素用sep连接起来

3.注意这里的append,作用的不是字典dic,而是dic[key]这个value,是一个列表list。


又坚持了一天,加油!

  • 20
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值