[leetcode]Anagrams

Anagrams

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

Note: All inputs will be in lower-case.

编程珠玑中的一道题,书中的解法很巧妙,我就直接搬来用了,时间空间复杂度都是O(n)

算法思路:

将每一个单词初始化,记录每个字符的个数,比如aaabca,初始化为a4b1c1。(也可以用排序做初始化,但是时间复杂度略高)

互为Anagrams的单词的初始化字符串是相同的

 1 public class Solution {
 2     public List<String> anagrams(String[] strs) {
 3         Map<String,List<String>> map = new HashMap<String,List<String>>();
 4         for(String s : strs){
 5             String init = initial(s);
 6             if(map.get(init) == null){
 7                 List<String> list = new ArrayList<String>();
 8                 list.add(s);
 9                 map.put(init,list);
10             }else{
11                 map.get(init).add(s);
12             }
13         }
14         List<String> res = new ArrayList<String>();
15         for(List<String> list : map.values()){
16             if(list.size() > 1){
17                 res.addAll(list);
18             }
19         }
20         return res;
21     }
22     private String initial(String s){
23         
24         int[] hash = new int[26];
25         
26         for(char c : s.toCharArray()){
27             hash[c - 'a']++;
28         }
29         StringBuilder sb = new StringBuilder();
30         for(int i = 0; i < 26; i++){
31             if(hash[i] > 0){
32                 sb.append((char)('a' + i ) ).append(hash[i]);
33             }
34         }
35         return sb.toString();
36     }
37 }

 

posted on 2014-08-01 19:56  喵星人与汪星人  阅读(359)  评论(0编辑  收藏  举报