擅长:python、mysql、java
<p>这里结合发生的顺序和它们不被组合在一起的可能性:</p>
<pre><code>anagram_list = ['cat','aba','baa','aab','tac','sos','oss','act']
first_anagrams = {}
anagram_dict = {}
for word in anagram_list:
sorted_word = ''.join(sorted(word))
if sorted_word in first_anagrams:
anagram_dict[first_anagrams[sorted_word]].append(word)
else:
first_anagrams[sorted_word] = word
anagram_dict[word] = []
print(anagram_dict)
</code></pre>
<p>输出是</p>
^{pr2}$
<p>其中,密钥总是按出现顺序排列的第一个anagram,对于长度为可忽略的<code>n</code>个单词,算法严格地<code>O(n)</code>。在</p>
<hr/>
<p>如果您想要列表中的所有变音图(包括第一个),它会变得更容易:</p>
<pre><code>anagram_list = ['cat','aba','baa','aab','tac','sos','oss','act']
first_anagrams = {}
anagram_dict = defaultdict(list)
for word in anagram_list:
anagram_dict[first_anagrams.setdefault(''.join(sorted(word)), word)].append(word)
</code></pre>
<p>结果是</p>
<pre><code>defaultdict(<type 'list'>,
{'aba': ['aba', 'baa', 'aab'], 'sos': ['sos', 'oss'], 'cat': ['cat', 'tac', 'act']})
</code></pre>