group anagrams leetcode java_LeetCode第[49]题(Java):Group Anagrams

题目:同字符分组

难度: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>groupAnagrams(String[] strs) {2 if (strs == null || strs.length == 0) return new ArrayList>();3 Map> map = new HashMap>();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());9 map.get(keyStr).add(s);10 }11 return new ArrayList>(map.values());12 }

我的复杂度:O(N*K*logK)  ———k为最长的字符串长度,sort方法为klogk

编码过程中的问题:

1、一开始使用的键为char[],后来发现数组的equals方法使用的是最原始的比较地址,并不会比较其中的内容,所以改成了String就好了;

2、将map转为List只需要调用map.values()方法就会返回一个包含所有元素的Collection,然后用其子类的构造方法接住都行。

答案代码:

1 public List>groupAnagrams(String[] strs) {2 if (strs.length == 0) return newArrayList();3 Map ans = new HashMap();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, newArrayList());15 ans.get(key).add(s);16 }17 return newArrayList(ans.values());18 }

答案复杂度:O(N*K)

答案思路:

1、和我的方法一样对String数组进行循环;

2、然后没有使用排序,而是做了一个只包含26个元素的数组,直接记录26个字母各有多少个

3、将这26个int,按顺序取出并拼接成一个字符串,这样也能表示使用相同字母的字符串的key

4、map没有则用此key,put一个List(有则不需要操作)。然后对应key的List直接add进当前String。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值