【leetcode刷题笔记】Anagrams

Given an array of strings, return all groups of strings that are anagrams.

Note: All inputs will be in lower-case.


 

题解:

所谓的anagrams,只若干个词,它们包含的字母的个数和种类完全一样,只是字符的顺序不一样。比如说bus,usb,sub就是一组angrams。同一组angrams具有排序后相同的特点,比如对上述三个单词按字典序排序分别得到bsu,bsu,bsu。我们用这一点判断两个单词是否是一组angrams。

题目给出一个String数组,要求找出其中所有angrams组,并把它们放在同一个list中返回。

比如给定输入[usb,tea,eat,that,bus,sub,and],应该返回输入[usb,bus,sub,tea,eat]。

利用map解这道题,其中key是单词按照字典序排序后得到的单词,value是排序后为key的单词在strs中索引。比如上述的例子里对应的map如下表所示:

key            value        
bsu0,4,5
aet1,2
ahtt3
adn6

然后遍历map,把value对应的list长度大于1的list对应的元素放入answer list中即可。

代码如下:

 1 public class Solution {
 2     public List<String> anagrams(String[] strs) {
 3         HashMap<String, ArrayList<Integer>> map = new HashMap<String, ArrayList<Integer>>();
 4         for(int i = 0;i < strs.length;i++){
 5             String s = strs[i];
 6             char[] chars = s.toCharArray();
 7             Arrays.sort(chars);
 8             String key = new String(chars);
 9             if(map.containsKey(key))
10             {
11                 ArrayList<Integer> value = map.get(key);
12                 value.add(i);
13                 map.put(key, value);
14             }
15             else{
16                 ArrayList<Integer> strings = new ArrayList<Integer>();
17                 strings.add(i);
18                 map.put(key, strings);
19             }
20         }
21         
22         List<String> answer = new ArrayList<String>();
23         
24         for(Map.Entry<String, ArrayList<Integer>> entry:map.entrySet()){
25             ArrayList<Integer> temp = entry.getValue();
26             if(temp.size() > 1){
27                 for(int i = 0;i < temp.size();i++)
28                     answer.add(strs[temp.get(i)]);
29             }
30         }
31         
32         return answer;
33     }
34 }

转载于:https://www.cnblogs.com/sunshineatnoon/p/3862528.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值