本文主要是介绍LeetCode 面试题 10.02. 变位词组,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
文章目录
- 一、题目
- 二、C# 题解
一、题目
编写一种方法,对字符串数组进行排序,将所有变位词组合在一起。变位词是指字母相同,但排列不同的字符串。
注意:本题相对原题稍作修改
示例:
输入: [“eat”, “tea”, “tan”, “ate”, “nat”, “bat”],
输出:
[
[“ate”,“eat”,“tea”],
[“nat”,“tan”],
[“bat”]
]
说明:
- 所有输入均为小写字母。
- 不考虑答案输出的顺序。
点击此处跳转题目。
二、C# 题解
分为三个步骤:
- 将同一排列的字符串 s 转换为唯一标识 key;
- 使用字典将同一 key 的 s 记录在同一组;
- 字典结果转化为列表。
public class Solution {public int[] Record = new int[26]; // 记录字符串 s 每个字符出现的次数public StringBuilder Sb = new StringBuilder(); // 用于将 Record 转化为对应字符串public IList<IList<string>> GroupAnagrams(string[] strs) {Dictionary<string, IList<string>> dic = new Dictionary<string, IList<string>>();foreach (string str in strs) {string key = GetKey(str); // 获取唯一标识if (dic.ContainsKey(key)) dic[key].Add(str); // 判断字典中是否存在else dic[key] = new List<string> { str };}return new List<IList<string>>(dic.Values); // 结果转换}// 获取字符串 s 对应排列的唯一标识public string GetKey(string s) {// 清空缓存for (var i = 0; i < Record.Length; i++) { Record[i] = 0; }Sb.Clear();foreach (char t in s) { Record[t - 'a']++; } // 统计 s 中每个字符出现的次数foreach (int t in Record) { Sb.Append('-' + t); } // 转化为对应字符串,添加 '-' 以消除歧义性return Sb.ToString();}
}
foreach (int t in Record) { Sb.Append('-' + t); } // 转化为对应字符串,添加 '-' 以消除歧义性
这句话中多添加 ‘-’ 是避免后续字符的统计次数影响到当前字符。例如:对于字符 '121'
可以表示为如下两种情况:
'1-21'
:a 统计了 1 次,b 统计了 21 次;'12-1'
:a 统计了 12 次,b 统计了 1 次。
- 时间:164 ms,击败 100.00% 使用 C# 的用户
- 内存:64.09 MB,击败 80.00% 使用 C# 的用户
这篇关于LeetCode 面试题 10.02. 变位词组的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!