面试题 10.02. 变位词组

题目

编写一种方法,对字符串数组进行排序,将所有变位词组合在一起。变位词是指字母相同,但排列不同的字符串。

示例:

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

分析: 遍历字符串数组,通过哈希字典用来存储变位词,key值可以用词排序后的结果,value是一个list,用来存储变位词,排序的时间复杂度为 O ( k l o g k ) O(klogk) O(klogk), 其中k是词的长度,因此总体时间复杂度为 O ( n ∗ k l o g ( k ) O(n*klog(k) O(nklog(k)

class Solution:
    def groupAnagrams(self, strs: List[str]) -> List[List[str]]:
        words_map = {}
        for i in range(len(strs)):
            word = ''.join(sorted(strs[i]))
            if word not in words_map:
                words_map[word] = [strs[i]]
            else:
                words_map[word].append(strs[i])
        return list(words_map.values())

当然,也可以创建一个26位长度数组,数组中的每一个位置记录一个单词中对应字母出现的频次,以此数组作为字典中的key值(Python中需要转化为元组,才能作为字典中的key值),变位词作为value, 省去了对单词的排序过程,时间复杂度 O ( n ∗ k ) O(n*k) O(nk)

class Solution:
    def groupAnagrams(self, strs: List[str]) -> List[List[str]]:
        words_map = {}
        for i in range(len(strs)):
            count = [0]*26
            for c in strs[i]:
                count[ord(c)-ord('a')] += 1
            if tuple(count) not in words_map:
                words_map[tuple(count)] = [strs[i]]
            else:
                words_map[tuple(count)].append(strs[i])
        return list(words_map.values())

你可能感兴趣的:(coding,算法)