Anagrams

給一個數列,找出所有的 anagrams,思路非常簡單,因為如果彼此是 anagram的話,

彼此 sort 之後也是 anagram,所以只要開個 Hashmap 把 sort 後的字串當作 key,然後對應的 index當作 value

每次找到同樣的 key 時把 value 加上 index,最後只要數量超過一的 value就是 anagrams

public List<String> anagrams(String[] strs) {

    List<String> results = new ArrayList<>();
    if (strs.length == 0) {
        return results;
    }

    HashMap<String, ArrayList<Integer>> map = 
        new HashMap<String, ArrayList<Integer>>();
    for (int i = 0; i < strs.length; i++) {
        char[] chs = strs[i].toCharArray();
        Arrays.sort(chs);
        String sorted = String.valueOf(chs);
        if (map.containsKey(sorted)) {
            map.get(sorted).add(i);
        }
        else {
            ArrayList<Integer> values = new ArrayList<Integer>();
            values.add(i);
            map.put(sorted, values);
        }
    }
    for (ArrayList<Integer> values : map.values()) {
        if (values.size() > 1) {
            for (int i = 0; i < values.size(); i++) {
                results.add(strs[values.get(i)]);
            }
        }
    }
    return results;
}

time complexity 一開始我以為是 O( MN ), M 為平均字串長度,它會影響 Hash的查找,N是字串數量

但中間有個步驟是排序,排序會影響時間的,所以應該是 O(nk) (Hashmap 空間)* O(klogk)(排序時間),k為最長字串長度

results matching ""

    No results matching ""