题目
题目链接:https://leetcode-cn.com/problems/group-anagrams-lcci/
题目解析:就是将字符串中字母数目相同的字符串放在一个集合里面。
- 创建map集合来存放判断依据,创建list集合来存放相同的变位字符串,通过将字符串按照字母大小重新排序,然后再进行比较,这样就可以很好地比较字符串是否是变位字符串。
- 遍历字符串数组,判断是否有相同的变位字符串
- 如果不是就重新创建一个list集合来存放字符串,然后将重新排列的字符串当作key,list在大list集合中的位置当作value放进map集合中
- 如果是就将大的list集合中拥有相同变位字符串的list集合拿出,放进去。
代码
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
//创键答案集合
List<List<String>> lists = new ArrayList<List<String>>();
//创建map集合
Map<String,Integer> map = new HashMap<String, Integer>();
//创建小的list集合
List<String> list2 = new ArrayList<>();
//遍历字符串
for (int i = 0; i < strs.length; i++) {
//将字符串按照字母大小重新排序
String str = sort(strs[i]);
//如果map集合中没有找到相同的字符串
if(map.get(str)==null) {
//创建新的list集合
List<String> list = new ArrayList<>();
//将判断字符串和list的位置放入map中
map.put(str, lists.size());
//list集合存放字符串
list.add(strs[i]);
//lists集合存放list
lists.add(list);
}else {//如果map集合有相同的字符串
//从map中拿出对应字符串list集合的位置
int l = map.get(str);
//从lists集合中拿出list集合
list2 = lists.get(l);
//在list集合中添加字符串
list2.add(strs[i]);
}
}
return lists;
}
//将字符串按照字母大小进行排序
private String sort(String string) {
StringBuffer sb = new StringBuffer();
int[] letter = new int[26];
for(int i = 0;i<string.length();i++) {
letter[string.charAt(i)-'a']++;
}
for(int i = 0;i<26;i++) {
while(letter[i]>0) {
sb.append((char)(i+'a'));
letter[i]--;
}
}
return sb.toString();
}
}