给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。
示例:
输入: ["eat", "tea", "tan", "ate", "nat", "bat"],
输出:
[
["ate","eat","tea"],
["nat","tan"],
["bat"]
]
说明:
所有输入均为小写字母。
不考虑答案输出的顺序。
【思路】:
利用Ascii码排序。
评论区非常棒的一个代码:(简洁易懂)
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
HashMap<String,ArrayList<String>> map=new HashMap<>();
for(String s:strs){
char[] ch=s.toCharArray();
Arrays.sort(ch);
String key=String.valueOf(ch);
if(!map.containsKey(key)) map.put(key,new ArrayList<>());
map.get(key).add(s);
}
return new ArrayList<List<String>>(map.values());
}
}
我的代码(显得太过冗长了,而且最后两个测试点超时过不了)
没想到直接把HashMap设为<String, ArrayList>类型的来用。
其实两个代码表现的思想是完全一样的。
class Solution {
//key = 字符串的值; value = 字符串按Ascii码排好序的值
Map<String, String> hash = new HashMap<String, String>();
//再用一个哈希表,记录每个字符串出现的个数
Map<String, Integer> hashNum = new HashMap<String, Integer>();
public List<List<String>> groupAnagrams(String[] strs) {
List<List<String>> res = new ArrayList<List<String>>();
//遍历字符串
for(int i = 0;i < strs.length;i++){
//转char数组
char [] arr = strs[i].toCharArray();
//--------更新本字符串出现的次数--------
if(hashNum.containsKey(strs[i])){
//得到出现次数
int cnt = hashNum.get(strs[i]);
hashNum.put(strs[i], cnt + 1);
}else{
hashNum.put(strs[i], 1);
//-----------------------------------
//排个序
Arrays.sort(arr);
//取出字符串排好序后的值
String temp = String.valueOf(arr);
//加到hash表中
hash.put(strs[i], temp);
}
}
//遍历哈希表,找出value相同的
for(Map.Entry<String, String> e : hash.entrySet()) {
String key = e.getKey();
String value = e.getValue();
//得到res的迭代器
Iterator<List<String>> it = res.iterator();
//表示是否找到该字符串放的位置
boolean ok = false;
//只要res里面还有链表
while(it.hasNext() && !ok){
//子链表
List<String> list = it.next();
//取出链表里面得一个元素,看看两者的value是否相等
String headValue = hash.get(list.get(0));
//如果两者value相等,那么把key这个字符串加到该链表中;注:这里用eauals方法对比
if(value.equals(headValue)){
int cnt = hashNum.get(key);
for(int i = 1;i <= cnt;i++){
list.add(key);
}
//找到位置
ok = true;
}
}
//如果到这里ok仍然是false;那么说明要新添加一个链表了
if(ok == false){
List<String> list = new ArrayList<String>();
//出现次数获得一下
int cnt = hashNum.get(key);
//根据出现次数来添加进去
for(int i = 1;i <= cnt;i++){
list.add(key);
}
res.add(list);
}
}
return res;
}
}