找出一個字串的所有anagram
阿新 • • 發佈:2018-12-24
給定一個字串集合S和一個字串str。要求設計一個數據結構,能夠快速找出集合S裡所有的、是str的anagram的字串。
思路:
首先,要分析什麼樣的字串才可以互稱為anagram。兩個字串如果是anagram,它們經過排序後得到的兩個字串一定相等。或者,兩個字串如果是anagram,它們包含的字元的頻率一定相等。
所以,基於anagram的這兩個性質,可以有以下兩種資料結構方案。
方案一:
採用Hashmap的資料結構:
對集合S裡的每一個字串s_i,首先按字元排序,得到一個sorted_s_i,把s_i插入到hashmap中sorted_s_i對應的List中去(當然,如果hashmap中還沒有sort_s_i,就要建立sort_s_i對應的資料項)。private Map<String, List<String>> anagrams = new HashMap<String, List<String>>();
要快速找出集合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