[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         }

 

posted on 2023-11-29 18:13  新西兰程序员  阅读(8)  评论(0编辑  收藏  举报