Q:给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
字母异位词 是由重新排列源单词的所有字母得到的一个新单词.
输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
输出: [["bat"],["nat","tan"],["ate","eat","tea"]]
我的思路:将每个字符串排序,相同的就是异位字符串.
Answer(C#):
public IList<IList<string>> GroupAnagrams(string[] strs) {
//结果集合
IList<IList<string>> twoDList = new List<List<string>>().Cast<IList<string>>().ToList();
//字典好检查异位字符串
Dictionary<int,string> dic = new Dictionary<int,string>();
//字典的key,也是结果集合的下标
int index = 0;
//遍历字符串数组
for(int i=0;i<strs.Length;i++){
//将字符串转字符数组,为了排序
char[] temp = strs[i].ToCharArray();
//排序
Array.Sort(temp);
//排序后转回字符串,为了放进字典里
string sortedString = new string(temp);
//排序的作用,可以判断这个字符串是不是异位的
if(!dic.ContainsValue(sortedString)){
//排序后判断与之前的字符串不存在异位情况
//将他add进字典里
//并将原字符串add进结果集合中
dic.Add(index,sortedString);
List<string> list = new List<string>();
list.Add(strs[i]);
twoDList.Add(list);
index++;
}else{
//有序后判断与之前地字符产有异位情况
//获取到字典地key,也就是结果集合的下表,将这个字符串add进去
int key = dic.FirstOrDefault(pair => pair.Value == sortedString).Key;
twoDList[key].Add(strs[i]);
}
}
//返回结果集合
return twoDList;
}
解析:
twoDList
是一个存储结果的集合,它的元素是一个个字符串列表。dic
是用于检查异位字符串的字典,它的键是结果集合的下标,值是经过排序后的字符串。index
是字典的键,也是结果集合的下标,用于标识不同的异位字符串组。
代码的执行流程如下:
- 遍历输入的字符串数组
strs
。 - 将每个字符串转换为字符数组,并对字符数组进行排序,得到排序后的字符串
sortedString
。 - 检查字典
dic
中是否已经存在值为sortedString
的键值对。如果不存在,说明这个字符串是一个新的异位字符串。- 将
sortedString
添加到字典dic
中,键为index
,并创建一个新的字符串列表list
,将当前字符串strs[i]
添加到list
中。 - 将
list
添加到结果集合twoDList
中,并将index
值增加 1。
- 将
- 如果字典
dic
中已经存在值为sortedString
的键值对,说明当前字符串是一个已经存在的异位字符串。- 在字典
dic
中找到键为sortedString
的键值对,并获取对应的键key
。 - 将当前字符串
strs[i]
添加到结果集合twoDList
中索引为key
的字符串列表中。
- 在字典
最后,代码返回结果集合 twoDList
,其中包含了按照异位字符串分组的字符串列表。
关于时间复杂度,这段代码的主要操作是遍历输入的字符串数组,并在字典中进行查找和添加操作。假设输入的字符串数组长度为 n
,字典中键值对的个数为 m
,那么代码的时间复杂度为 O(n * m)。请注意,这只是对主要操作的时间复杂度估计,实际的时间复杂度可能会受到其他因素的影响