标签:键值 fill 判断 编码 调用 get inpu span 比较
题目:同字符分组
难度:Medium
题目内容:
Given an array of strings, group anagrams together.
翻译:给定一组字符串数组,按相同字符组成的字符串分为一组。
Example:
Input: ["eat", "tea", "tan", "ate", "nat", "bat"]
,
Output:
[
["ate","eat","tea"],
["nat","tan"],
["bat"]
]
我的思路:因为要分组,那么使用map即可,相同的字符作为键,值为一个List作为对应分组
1、首先遍历,每次将当前字符串打断成char数组,然后sort,判断map中是否包含此sort后的char
2、是的话则将此字符串add进此key对应的值(List)里面
否则往map里put一个新的键值对
我的代码:
1 public List<List<String>> groupAnagrams(String[] strs) { 2 if (strs == null || strs.length == 0) return new ArrayList<List<String>>(); 3 Map<String, List<String>> map = new HashMap<String, List<String>>(); 4 for (String s : strs) { 5 char[] ca = s.toCharArray(); 6 Arrays.sort(ca); 7 String keyStr = String.valueOf(ca); 8 if (!map.containsKey(keyStr)) map.put(keyStr, new ArrayList<String>()); 9 map.get(keyStr).add(s); 10 } 11 return new ArrayList<List<String>>(map.values()); 12 }
我的复杂度:O(N*K*logK) ———k为最长的字符串长度,sort方法为klogk
编码过程中的问题:
1、一开始使用的键为char[],后来发现数组的equals方法使用的是最原始的比较地址,并不会比较其中的内容,所以改成了String就好了;
2、将map转为List只需要调用map.values()方法就会返回一个包含所有元素的Collection,然后用其子类的构造方法接住都行。
答案代码:
1 public List<List<String>> groupAnagrams(String[] strs) { 2 if (strs.length == 0) return new ArrayList(); 3 Map<String, List> ans = new HashMap<String, List>(); 4 int[] count = new int[26]; 5 for (String s : strs) { 6 Arrays.fill(count, 0); 7 for (char c : s.toCharArray()) count[c - ‘a‘]++; 8 9 StringBuilder sb = new StringBuilder(""); 10 for (int i = 0; i < 26; i++) { 11 sb.append(count[i]); 12 } 13 String key = sb.toString(); 14 if (!ans.containsKey(key)) ans.put(key, new ArrayList()); 15 ans.get(key).add(s); 16 } 17 return new ArrayList(ans.values()); 18 }
答案复杂度:O(N*K)
答案思路:
1、和我的方法一样对String数组进行循环;
2、然后没有使用排序,而是做了一个只包含26个元素的数组,直接记录26个字母各有多少个
3、将这26个int,按顺序取出并拼接成一个字符串,这样也能表示使用相同字母的字符串的key
4、map没有则用此key,put一个List(有则不需要操作)。然后对应key的List直接add进当前String。
LeetCode第[49]题(Java):Group Anagrams
标签:键值 fill 判断 编码 调用 get inpu span 比较
原文地址:https://www.cnblogs.com/Xieyang-blog/p/9026844.html