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。
又坚持了一天,加油!