本文始发于个人公众号:TechFlow,原创不易,求个关注
今天是LeetCode专题的第30篇文章,一起来看一道字符串分组的问题。
题意
这题的题意很简单,给定一个字符串数组,要求将所有字符串按照构成分组。
举个例子,比如给定的数组是[eat, ate, tea, tan, nat, bat]。
其中eat,ate,tea这三个单词用到的字母都是e,t和a各一个。tan和nat用到的都是a,n和t,最后剩下bat,所以分组结果就是:[eat, ate, tea],[tan, nat]和[bat]。
暴力
我们依然从最简单的思路开始想起,我们分组的依据是每一个字符串当中用到的字母的情况。所以我们可以把每一个字符串当中所有的元素拆解出来,放到一个dict当中,然后我们用这个dict来作为分组的标准,将dict相同的字符串放在同一组。
比如eat我们把它变成{‘e’: 1, ‘a’: 1, ‘t’: 1},由于一个字母可能出现多个,所以我们也要记录出现的次数。但有一个问题是,dict是动态数据,在Python当中我们不能用它作为另一个dict的key。这个问题比较简单的方法是我们写一个方法将这个dict拼接成字符串,比如’e1a1t1’。我们用这个作为key。但是这又有了一个问题,dict当中的key并不一定是有序的,所以我们需要对dict进行排序,可以看下下图中的流程。
也就是说我们需要实现一个函数,它的输入是字符串,输出是这个字符串构成的元素。
def splitStr(s):
d = defaultdict(int)
for c in s:
d[c] += 1
ret = ''
# 将dict中内容排序
for k,v in sorted(d.items()):
ret += (str(k) + str(v))
return ret
到这里就简单了,我们在外层再创建一个dict用来存储分组后的结果即可,我们很容易就能写出代码:
from collections import defaultdict
class Solution:
def splitStr(self, s):
d = defaultdict(int)