[LeetCode] 49. Group Anagrams 分组变位词
Given an array of strings, group anagrams together.
For example, given: ["eat", "tea", "tan", "ate", "nat", "bat"]
,
Return:
[ ["ate", "eat","tea"], ["nat","tan"], ["bat"] ]
Note: All inputs will be in lower-case.
给一个含字符串的数组,字符串是变位词的分在一组,返回所有分组。变位词就是一个单词通过改变单词当中的字母顺序变成另外一个单词。
解法:迭代数组中的每一个单词,把单词的字符进行排列,以排序后的单词为key原单词为value,添加到HashMap中,如果是变位词的话,排序后应该是一样的单词,所以会添加到同一个key里面。然后在按key的分组把value添加到list,返回list。
Java:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | public List<List<String>> groupAnagrams(String[] strs){ List<List<String>> lists= new ArrayList<List<String>>(); Map<String,List<String>> map= new HashMap<String,List<String>>(); for (String str:strs){ char [] chs=str.toCharArray(); Arrays.sort(chs); String tmp= new String(chs); if (map.containsKey(tmp)) map.get(tmp).add(str); else { List<String> list= new ArrayList<String>(); list.add(str); map.put(tmp, list); } } for (String str:map.keySet()){ lists.add(map.get(str)); } return lists; } |
Java:
1 2 3 4 5 6 7 8 9 10 11 12 13 | public class Solution { public List<List<String>> groupAnagrams(String[] strs) { Map<String, List<String>> map = new HashMap<>(); for (String s : strs) { char [] sc = s.toCharArray(); Arrays.sort(sc); String key = String.valueOf(sc); map.putIfAbsent(key, new ArrayList<>()); map.get(key).add(s); } return new ArrayList<>(map.values()); } } |
Python:HashMap
1 2 3 4 5 6 7 8 9 10 11 12 | class Solution( object ): def groupAnagrams( self , strs): anagrams_map, result = collections.defaultdict( list ), [] for s in strs: sorted_str = ("").join( sorted (s)) anagrams_map[sorted_str].append(s) for anagram in anagrams_map.values(): anagram.sort() result.append(anagram) return result |
C++:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | class Solution { public : vector<vector<string>> groupAnagrams(vector<string>& strs) { vector<vector<string>> res; unordered_map<string, vector<string>> m; for (string str : strs) { string t = str; sort(t.begin(), t.end()); m[t].push_back(str); } for ( auto a : m) { res.push_back(a.second); } return res; } }; |
C++:Array
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | class Solution { public : vector<vector<string>> groupAnagrams(vector<string>& strs) { vector<vector<string>> res; unordered_map<string, vector<string>> m; for (string str : strs) { vector< int > cnt(26, 0); string t = "" ; for ( char c : str) ++cnt[c - 'a' ]; for ( int d : cnt) t += to_string(d) + "/" ; m[t].push_back(str); } for ( auto a : m) { res.push_back(a.second); } return res; } }; |
类似题目:
[LeetCode] 249. Group Shifted Strings 分组偏移字符串
All LeetCode Questions List 题目汇总
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core GC计划阶段(plan_phase)底层原理浅谈
· .NET开发智能桌面机器人:用.NET IoT库编写驱动控制两个屏幕
· 用纯.NET开发并制作一个智能桌面机器人:从.NET IoT入门开始
· 一个超经典 WinForm,WPF 卡死问题的终极反思
· ASP.NET Core - 日志记录系统(二)
· 博客园 & 1Panel 联合终身会员上线
· 支付宝事故这事儿,凭什么又是程序员背锅?有没有可能是这样的...
· https证书一键自动续期,帮你解放90天限制
· 在 ASP.NET Core WebAPI如何实现版本控制?
· 告别虚拟机!WSL2安装配置教程!!!