Anagrams

题目:

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

Note: All inputs will be in lower-case.

思路:

面试过更简单的形式,判断两个string是否是anagram。当时用的hashmap做的。key是character,value是出现的次数。先扫描第一个string建立这个hashmap,然后扫描第二个string,看是否最后hashmap的所有value都为0. 这样做的时间复杂度是m+n.因为扫描两个string各一次。

但是对于这道题,就不能这么做了。如果要找出所有的group,那么就需要拿出一个string然后和剩下的所有string做比较。然后剔除掉,再反复比较。

所以我们想到另一种方法。我们把每一个string变为char型数组,并且按字母顺序排序。这样扫描一下就知道这两个string是否相同了。我们把结果存在HashMap里。key是char型数组所转化得到的string。value就是一个arraylist存着是anagram的string

 1     public List<String> anagrams(String[] strs) {
 2         List<String> res = new ArrayList<String>();
 3         if (strs == null || strs.length == 0) {
 4             return res;
 5         }
 6         HashMap<String, ArrayList<String>> map = new HashMap<String, ArrayList<String>>();
 7         for (String t : strs) {
 8             char[] charArray = t.toCharArray();
 9             Arrays.sort(charArray);
10             String temp = new String(charArray);
11             if (map.containsKey(temp)) {
12                 map.get(temp).add(t);
13             }else{
14                 ArrayList<String> newItem = new ArrayList<String>();
15                 newItem.add(t);
16                 map.put(temp, newItem);
17             }
18         }
19         for (ArrayList<String> group : map.values()) {
20             if (group.size() > 1) {
21                 res.addAll(group);
22             }
23         }
24         return res;
25     }

 

posted @ 2015-05-04 00:52  GoNuts  阅读(157)  评论(0编辑  收藏  举报