【题目】
Given an array of strings, group anagrams together.
For example, given: [“eat”, “tea”, “tan”, “ate”, “nat”, “bat”],
Return:
[ [“ate”, “eat”,”tea”], [“nat”,”tan”], [“bat”] ]
【分析】
题意为将字符串数组中的字符串分类放入集合中,放入同一个集合中的字符串含有相同的字符。也就是按字符串的全排列区分字符串。
若求出每个一个字符串的所有全排列,然后遍历后面的字符串,再判断该字符串是否出现在全排列中,若是则将其归类。这种笨解法效率太低。
思路是先建立一个map,利用map的特性来存放和key一类的字符串集合。
遍历到某个字符串str时,先求出该字符串按照自然顺序排列的串nsts,然后判断map中是否含有nsts,若没有,则说明这是一个新出现的串,则将key=nsts,value=只含有str一个字符串的list插入map中;若map中含有nsts,则说明之前已经出现过含有相同字符的串,将给字符串加入对应的value中即可。最后得到map的value集合即为结果。
【Java实现】
public class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
List<List<String>> res = new ArrayList<List<String>>();
if(strs==null || strs.length==0) return res;
Map<String,List<String>> map = new HashMap<String,List<String>>();
List<String> templist=null;
for (int i = 0; i < strs.length; i++) {
String nsts = getStringOnOrder(strs[i]);//将字符串字符排序
if(map.containsKey(nsts)){
templist = map.get(nsts);
templist.add(strs[i]);
map.put(nsts,templist);
}else{
List<String> nlist = new ArrayList<>();
nlist.add(strs[i]);
map.put(nsts, nlist);
}
}
for (List<String> i:map.values()) {
res.add(i);
}
return res;
}
private static String getStringOnOrder(String s) {
char[] ch = s.toCharArray();
Arrays.sort(ch);
StringBuilder sb = new StringBuilder();
for (char c : ch) {
sb.append(c);
}
return sb.toString();
}
}