原题:
Given an array of strings, group anagrams together.
For example, given: ["eat", "tea", "tan", "ate", "nat", "bat"],
Return:
[
["ate", "eat","tea"],
["nat","tan"],
["bat"]
]
题目大意:给出一个字符串数组,将其按照组成字母相同这一条件来分组,即组成字符串的字符完全相同的字符串分成一组。
解题思路:
仔细观察会发现,"ate", "eat","tea"排完序之后都是“ate”,
利用哈希表,将排完序的字符串在哈希表中查找,并且保存他进入哈希表的顺序位置。
比如例子中,如果当前排序后的字符串不存在哈希时就压入哈希(以下为遍历完的结果)
mapping["ate"]=0,
mapping["nat"]=1,
mapping["bat"]=2,
显然0这个位置就是所有移位"ate", "eat","tea"字符串所在result二维数组中的第一行
同理1这个位置就是所有移位"nat","tan"字符串所在result二维数组中的第二行
同理2这个位置就是"bat"字符串所在result二维数组中的第三行
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
List<List<String>> res = new ArrayList<>();
if(strs == null || strs.length == 0) return res;
HashMap<String,Integer> map = new HashMap<>();
for(String str : strs){
char[] ch = str.toCharArray();// toCharArry():把字符串转为char字符数组;
Arrays.sort(ch);
String s= new String(ch);//将字符串数组中的值重新排序装回字符串
if(map.containsKey(s)){
List<String> list = res.get(map.get(s));//map.get(s)得到hashmap中数组键值 res.get 该元素返回的索引值类似于a[i]。
list.add(str);
}else{
List<String> list = new ArrayList<>();
list.add(str);
map.put(s,res.size());
res.add(list);
}
}
return res;
}
}