纯属个人打开学习记录,无任何参考意义
49.字母异位词分组
给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。
示例:
输入: [“eat”, “tea”, “tan”, “ate”, “nat”, “bat”],
输出:
[
[“ate”,“eat”,“tea”],
[“nat”,“tan”],
[“bat”]
]
说明:
1、所有输入均为小写字母。
2、不考虑答案输出的顺序。
思路
这题目乍一看真简单,写起来真费劲,首先想到的是用map来解决问题,因为要求的返回值是List<List<String>>
类型,获取List里面第几个List这样的操作不太好实现,直接用map的键槽来获取显然方便,还不用遍历。为啥要有获取List里面第几个List这样的操作呢,因为你遍历输入的数组时,每个字符串不一定在List的第一个组合中。
然后就是思考键值槽值放什么数据类型了,槽值好说,肯定是List<String>
这表示一个一个的组合,键值可以是String,或者char数组。
这里的话键值显然要能映射List<String>
里面的所有元素,所以我将string类型转换成了char数组,然后调用Array.sort()函数将数组从小到大排序,同样将要检查的strs[i]也进行转换成数组然后从小到大排序,这样也方便比较是否属于同一类。
然后成功的写出了史上跑的最慢的代码,不过还好AC了。。。
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
List<List<String>> res = new ArrayList<>();
Map<char[], List<String>> map = new HashMap<char[], List<String> >();
for(int i = 0; i < strs.length; i++)
{
char[] temp = strs[i].toCharArray();
Arrays.sort(temp);
String s = String.valueOf(temp);
List<String> listTemp = new ArrayList<String>();
int flag = 0;
for (char[] key : map.keySet()) {
for(int j = 0; j < key.length; j++)
{
if(key[j] != temp[j])
{
break;
}else if(key[j] == temp[j] && j == key.length - 1)
{
map.get(key).add(strs[i]);
flag = 1;
break;
}
}
if(flag == 1)
{
break;
}
}
if(flag == 0)
{
listTemp.add(strs[i]);
map.put(temp,listTemp);
}
}
for (char[] key : map.keySet())
{
res.add(map.get(key));
}
return res;
}
}
哈哈哈哈哈我是醉了,尝试了一下然后一点优化的欲望都没有了。。。
然后凑巧的是看了下官方题解,思路一模一样。。。但是他写的如此亭亭玉立。。。
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());
}
}
不要脸的提交了一下。。。
然后我发现了我傻逼的地方在于把map类的containsKey函数重新写了一遍,而且写的没人家好用,没人家效率高。。。