题目:Group Anagrams
难度:medium
问题描述:
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.
解题思路:
问题是要将给的字符串数组分类。首先要给每个字符串打上标签,这里使用了排序方法,每个字符串的标签就是它的最小排序。例如“abc”、“bac”、“cba”的标签都是“abc”。
然后构造hashmap,key为标签,value为list<String>,里面存放着标签为key的字符串。最后遍历hashmap,将所有list放入List<List<String>>中输出即可。
具体代码如下:
public class m_49_GroupAnagrams {
public static List<List<String>> groupAnagrams(String[] strs) {
String[] res=presort(strs);//存放每个字符串的标签
ArrayList<List<String>> lists=new ArrayList<List<String>>();//返回值
HashMap<String,List<String>> hm=new HashMap<>();
HashSet<String> hs=new HashSet<>();//用来遍历hashmap
ArrayList<String> list;
for(int i=0;i<strs.length;i++){
if(!hs.contains(res[i])){
hs.add(res[i]);
}
}
for( int i=0;i<res.length;i++){
if(!hm.containsKey(res[i])){
list=new ArrayList<>();
list.add(strs[i]);
hm.put(res[i], list);
}else{
list=(ArrayList<String>)hm.get(res[i]);
list.add(strs[i]);
hm.put(res[i], list);
}
}
for(String w:hs){
lists.add(hm.get(w));
}
for(int i=0;i<lists.size();i++){
list=(ArrayList<String>)lists.get(i);
for(int j=0;j<list.size();j++){
System.out.print(list.get(j)+":");
}
System.out.println();
}
return lists;
}
public static String[] presort(String[] strs){
char[] cs;
String[] res=new String[strs.length];
for(int i=0;i<strs.length;i++){
cs=strs[i].toCharArray();
Arrays.sort(cs);
res[i]=String.valueOf(cs);
}
return res;
}
public static void main(String[]args){
String[] ss=new String[6];
ss[0]="eat";
ss[1]="tea";
ss[2]="tan";
ss[3]="ate";
ss[4]="nat";
ss[5]="bat";
groupAnagrams(ss);
}
}