1. 程式人生 > >找出一個字串的所有anagram

找出一個字串的所有anagram

給定一個字串集合S和一個字串str。要求設計一個數據結構,能夠快速找出集合S裡所有的、是str的anagram的字串。

思路:

首先,要分析什麼樣的字串才可以互稱為anagram。兩個字串如果是anagram,它們經過排序後得到的兩個字串一定相等。或者,兩個字串如果是anagram,它們包含的字元的頻率一定相等。

所以,基於anagram的這兩個性質,可以有以下兩種資料結構方案。

方案一:

採用Hashmap的資料結構:

private Map<String, List<String>> anagrams = new HashMap<String, List<String>>();
對集合S裡的每一個字串s_i,首先按字元排序,得到一個sorted_s_i,把s_i插入到hashmap中sorted_s_i對應的List中去(當然,如果hashmap中還沒有sort_s_i,就要建立sort_s_i對應的資料項)。

要快速找出集合S裡所有的、是str的anagram的字串,只需對str按字元排序,然後從hashmap裡找出對應的List,List的字串就是待求的所有字串。

方案二:

虛擬碼如下:

class Word

  string word
  map<char, int> frequency

  Word(string w)
    word = w
    for char in word
      int count = frequency.get(char)
      if count == null
        count = 0
      count++
      frequency.put(char, count)

  boolean is_anagram_of(that)
    return this.frequency == that.frequency