標籤:leetcode java anagrams
題目:
Given an array of strings, return all groups of strings that are anagrams.
Note: All inputs will be in lower-case.
題意:
給定一個字串數組,返回所有的易位構片語合。
注意:所有的輸入都是小寫。
演算法分析:
易位構詞其實也很好理解,就是兩個單詞所包含的字元和數量都是一樣的,只是順序不同
對字串中各字母進行排序,那麼互為重排列的字串就會相等。
按照上述思路,用一個map紀錄按字母排序後的字串及其出現位置(或原字串),在遍曆過程中,如果遇到排序後的字串相等的,就說明兩者互為重排列。
第一次出現的重排列字串需要特殊照顧下,下述代碼中用-1標識第一次出現的重排列字串是否已經加入結果。
此外,對字串按字母排序的方法可以用Java類庫的char數組排序;也可以利用題目所說的字串中只含有小寫字母這一資訊,進行計數排序
AC代碼:
public ArrayList<String> anagrams(String[] strs) { ArrayList<String> list = new ArrayList<String>(); HashMap<String, Integer> map = new HashMap<String, Integer>(); for (int i = 0; i < strs.length; ++i) { char[] chars = strs[i].toCharArray(); Arrays.sort(chars); String anagram = new String(chars); if (map.containsKey(anagram)) { int index = map.get(anagram); if (index != -1) { list.add(strs[index]); map.put(anagram, -1);//用-1標識第一次出現的重排列字串 } list.add(strs[i]); } else map.put(anagram, i); } return list; }
著作權聲明:本文為博主原創文章,轉載註明出處
[LeetCode][Java] Anagrams