题干
给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
字母异位词 是由重新排列源单词的所有字母得到的一个新单词。
示例 1:
输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
输出: [["bat"],["nat","tan"],["ate","eat","tea"]]
示例 2:
输入: strs = [""]
输出: [[""]]
示例 3:
输入: strs = ["a"]
输出: [["a"]]
提示:
1 <= strs.length <= 104
0 <= strs[i].length <= 100
strs[i]
仅包含小写字母
思路1:直接模拟过程
class Solution { public List<List<String>> groupAnagrams(String[] strs) { List<List<String>> res = new ArrayList<>(); Set<Integer> skipSet = new HashSet<>(); for(int i=0;i<strs.length;i++){ if(skipSet.contains(i)){ continue; } List<String> singleRes = new ArrayList<>(); singleRes.add(strs[i]); Map<Character,Integer> count = new HashMap<>(); for(int j=0;j<strs[i].length();j++){ char c = strs[i].charAt(j); count.put(c,count.getOrDefault(c,0)+1); } if(i+1<strs.length){ for(int j=i+1;j<strs.length;j++){ Map<Character,Integer> target = new HashMap<>(); for(int k=0; k<strs[j].length();k++){ char c = strs[j].charAt(k); target.put(c, target.getOrDefault(c,0)+1); } if(count.equals(target)){ singleRes.add(strs[j]); skipSet.add(j); } } } res.add(singleRes); } return res; } }
结果:
提交之后发现问题:
思路2:字符串提前排序
class Solution { public List<List<String>> groupAnagrams(String[] strs) { //排序 Map<String,List> map = new HashMap<String,List>(); for(String s :strs){ char[] arr = s.toCharArray(); Arrays.sort(arr); String str = String.valueOf(arr); if(!map.containsKey(str)){ map.put(str,new ArrayList()); } map.get(str).add(s); } return new ArrayList(map.values()); } }
标签:map,String,49,strs,异位,ArrayList,分组,str,new From: https://www.cnblogs.com/ak918xp/p/18117593