LeetCode题目链接链接
https://leetcode-cn.com/problems/group-anagrams/
给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。
示例:
输入:["eat", "tea", "tan", "ate", "nat", "bat"],
输出:[ ["ate","eat","tea"], ["nat","tan"], ["bat"]]
说明:
所有输入均为小写字母。
不考虑答案输出的顺序。
解题思路
首先我会想到如果 eat和eata算不算字母位词组。恕我语文是体育老师教的。于是我偷偷那了标准答案去测试
测试用例为
["eat","tea","tan","atea","nat","bat"]
执行结果为
[["eat","tea"],["atea"],["bat"],["tan","nat"]]
答案显而易见,不算字母位词组。那不就是如果我给每个数字里面的元素排序,那么我就可以直接equals()判断?
代码
public List<List<String>> groupAnagrams(String[] strs) {
List<List<String>> lists = new ArrayList<>();
int length = strs.length;
String[] sortStr = new String[length];
for (int i = 0; i < length; i++) {
char[] chars = strs[i].toCharArray();
Arrays.sort(chars);
sortStr[i] = new String(chars);
}
int[] tag = new int[length];
for (int i = 0; i < length; i++) {
if (tag[i]==0){
lists.add(new ArrayList<String>());
lists.get(lists.size()-1).add(strs[i]);
}
int parentPosition = lists.size()-1;
for (int j = i+1; j < length; j++) {
if (sortStr[i].equals(sortStr[j]) && tag[j]==0){
tag[j] = 1;
lists.get(parentPosition).add(strs[j]);
};
}
}
return lists;
}
分析:
1.首先我讲strs进行排序,生成新的排序sortStr字符;
2.然后创建int[] tag ,他的作用就是用标记当前的位置的字符串是否是一个新的字母异位词,如果是,将标记置为1并且new 一个新的ArrayList;
这是我个人的青铜五渣渣思路。感觉这题目没有什么难度。于是看了官方的解答,瞬间被完爆了。思路也很清晰。就用一个for循环就搞定。我就不扯犊子了。
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
if (strs.length == 0) return new ArrayList();
Map<String, List> ans = new HashMap<String, List>();
for (String s : strs) {
char[] ca = s.toCharArray();
Arrays.sort(ca);
String key = String.valueOf(ca);
if (!ans.containsKey(key)) ans.put(key, new ArrayList());
ans.get(key).add(s);
}
return new ArrayList(ans.values());
}
}
提交记录
这是大神的
这是我的