***49. Group Anagrams 字母异位词分组

1. 原始题目

给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。

示例:

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

说明:

  • 所有输入均为小写字母。
  • 不考虑答案输出的顺序。

2. 思路

方法1:将字符串分别排序后判定是否是异位次

方法2:将字符串利用字母表计数后判定是否是异位次

3. 解题

首先复习几个知识点:

1)chr() 函数用一个整数作参数,返回值是当前整数对应的 ASCII 字符。

>>>chr(0x30)
'0'
>>> chr(97) 
'a'
>>> chr(8364)
''

 

2)  ord() 函数是 chr() 函数(对于8位的ASCII字符串)或 unichr() 函数(对于Unicode对象)的配对函数,它以一个字符(长度为1的字符串)作为参数,返回对应的 ASCII 数值,或者 Unicode 数值,如果所给的 Unicode 字符超出了你的 Python 定义范围,则会引发一个 TypeError 的异常。

>>>ord('a')
97
>>> ord('b')
98
>>> ord('c')
99

 

3)python字典get方法

Python 字典(Dictionary) get() 函数返回指定键的值,如果值不在字典中返回默认值。

ict.get(key, default=None)
dict = {'Name': 'Zara', 'Age': 27}

print "Value : %s" %  dict.get('Age')
print "Value : %s" %  dict.get('Sex', "Never")

Value : 27
Value : Never

 

4)python字典 setdefault()方法

 Python 字典 setdefault() 函数和 get()方法 类似, 如果键不存在于字典中,将会添加键并将值设为默认值。

dict = {'runoob': '菜鸟教程', 'google': 'Google 搜索'}
 
print "Value : %s" %  dict.setdefault('runoob', None)
print "Value : %s" %  dict.setdefault('Taobao', '淘宝')

Value : 菜鸟教程
Value : 淘宝

 

正式解题(several ways):

方法1:排序后的字符串作为键

1 class Solution(object):
2     def groupAnagrams(self, strs):
3         ans = collections.defaultdict(list)   # 默认值为list
4         for s in strs:
5             ans[tuple(sorted(s))].append(s)   # 注意字典的键必须为可哈希,所以应转为tuple
6         return list(ans.values())
1 class Solution:
2     def groupAnagrams(self, strs: 'List[str]') -> 'List[List[str]]':
3         
4         ind = {}
5         for s in strs:
6             k = ''.join(sorted(s))
7             ind.setdefault(k, []).append(s)
8         
9         return list(ind.values())

 

方法2:计数后的字符串作为键。利用26个小写字母计数。

1 class Solution:
2     def groupAnagrams(strs):
3         ans = collections.defaultdict(list)
4         for s in strs:
5             count = [0] * 26      # 26个字母分别计数,如果计数完全相同的两个字符串则视为异位词
6             for c in s:
7                 count[ord(c) - ord('a')] += 1    # ord将字符转为整型
8             ans[tuple(count)].append(s)
9         return ans.values()

 

posted @ 2019-05-05 22:19  三年一梦  阅读(181)  评论(0)    收藏  举报