[LettCode-中等] 字母异位词分组
这是一道中等难度题,首先我们来了解一下,什么是字母异位词 =》 由重新排列源单词的所有字母得到一个新单词
字母异位词 =》 它是这个意思,比如说一个字符串由3个字符abc组成, 就是"abc",现在我把组成这个字符串的字母顺序随意调换,比如变成 "bac","bca","cab"等, 这几个词就是字母异位词
也就是说,组成它们的字母是一样的,只不过排列顺序不一样
这道题目是这样的,就是说给你一个字符串数组,需要你找出这个数组中的字母异位词,把它们单独放在一起组成一个数组。 也就是说,最后很有可能返回的是一个大数组中包含几个小数组
比如 输入 strArr = ["eat", "tea", "abc", "bca","see","ate"] => strArr仅包含小写字母
输出的就应该是 [["see"],["abc","bca"],["ate","eat","tea"]]
我们来看看这道题的解题思路
我们来看,字母异位词,它们都由相同的字符组成,所以我们能想到,如果我把它们每一个都按照字母顺序排序,那是不是变成一样的了呢。 所以解题思路就有了,循环strArr, 对其中的每一个字符串进行字母顺序排序(这就需要把这个字符串转换为字符数组,然后对这个字符数组进行排序,排序完成后再转化为字符串,看看这个时候转换完的字符串是不是一样,一样就代表它们是字母异位词), 这样,把排序完一样的,就是字母异位词,放在一个新的数组中 => 但是这样的,我们如何知道要多少个新数组呢,或者说我怎么知道源数组strArr中第1个元素和第2个元素要放入一个新数组,第三个和第四个元素要放入另一个新数组,所以我们需要一个键来表示,哪几个元素应该放入同一个新数组,显然这个键就是源字符串排序后新生成的字符串,表示如下
Key | Array |
see | ["see"] |
abc | ["abc"."bca"] |
aet | ["eat","tea","ate"] |
显然,这种结构,在C#中,我们会想到用Dictionary来实现(它支持泛型),在C++中用map来实现
C#中使用一个 Dictionary<string,List<string>>来实现,显然最后需要返回的就是这个Dictionary的值组成的新数组
C#实现代码
1 public List<List<string>> GroupAnagrams(string[] strs) 2 { 3 Dictionary<string, List<string>> myDic = new Dictionary<string, List<string>>(); 4 5 //循环遍历源字符串数组 6 foreach (var str in strs) 7 { 8 char[] charArr = str.ToCharArray(); 9 Array.Sort(charArr); 10 11 var key = charArr.ToString(); 12 13 if (myDic.ContainsKey(key)) 14 { 15 myDic[key].Add(str); 16 } 17 else 18 { 19 myDic.Add(key, new List<string> { str }); 20 } 21 22 } 23 24 return new List<List<string>>(myDic.Values); 25 26 }