1. 程式人生 > >lintcode | 171.亂序字串

lintcode | 171.亂序字串

題目

給出一個字串陣列S,找到其中所有的亂序字串(Anagram)。如果一個字串是亂序字串,那麼他存在一個字母集合相同,但順序不同的字串也在S中。

注意事項
所有的字串都只包含小寫字母

樣例
對於字串陣列 [“lint”,”intl”,”inlt”,”code”]
返回 [“lint”,”inlt”,”intl”]

思路

一,使用HashMap,亂序字串擁有同樣的key,亂序字串放入ArrayList< String >中,作為value

二,key該是什麼形式? 字元+個數 “abadc”——> “a2b1c1d1”

三,首先:將陣列S中元素put進hash中
然後:獲取hash的values,遍歷,若value.size()>1,則為一組亂序字串

程式碼

public class Solution {
    /**
     * @param strs: A list of strings
     * @return: A list of strings
     */
    public ArrayList<String> anagrams(String[] strs)
    {
        HashMap<String,ArrayList<String>> hash=new
HashMap<String,ArrayList<String>>(); for(String str:strs) { String key=generalString(str); ArrayList<String> res=hash.get(key); if(res==null) { res=new ArrayList<String>(); hash.put(key, res); //沒有此<key,value>時,將其put進hashmap中
} res.add(str); //在此給value ArrayList<String>新增遍歷到的String } ArrayList<String> resSet =new ArrayList<String>(); for(ArrayList<String> anagram:hash.values()) { if(anagram.size()>1) resSet.addAll(anagram); //addAll 新增ArrayList<String> } return resSet; } public String generalString(String s) { int[] a=new int[26]; int i; for(i=0;i<s.length();i++) { a[(int)s.charAt(i)-'a']++; } StringBuilder sb=new StringBuilder(); for(i=0;i<26;i++) { if(a[i]!=0) { sb.append((char)('a'+i)); sb.append(a[i]); } /* if(a[i]==0) continue; sb.append((char)('a'+i)); sb.append(a[i]);*/ } return sb.toString(); } }

知識點

  1. HashMap定義,初始化
    HashMap< String,ArrayList< String>> hash=new HashMap< String,ArrayList< String>>();

  2. HashMap新增元素
    hash.put(key,res);

  3. HashMap由key取value
    ArrayList< String> res=hash.get(key);

  4. HashMap中所有值
    hash.values()

  5. 陣列的另一種遍歷方法
    for(String str:S){ …. }

  6. ArrayList< T> A 新增 ArrayList< T> a的所有元素
    A.addAll(a);