我將以非操作系統特定的方式來描述這種情況的一種可能性是對組成字母集合的所有可能字進行搜索。
基本上,你把你的信件收集的第一個字母切掉,並將其添加到你正在形成的當前單詞中。如果它生成一個單詞(例如字典查找),則將它添加到當前句子中。如果你設法用盡你的收藏中的所有字母並形成所有的字母,那麼你有一個完整的句子。但是,你不必在這裏停下來。相反,你繼續跑步,最終你會產生所有可能的句子。
僞代碼將是這個樣子:
FindWords(vector<Sentence> sentences, Sentence s, Word w, Letters l)
{
if (l.empty() and w.empty())
add s to sentences;
return;
if (l.empty())
return;
add first letter from l to w;
if w in dictionary
{
add w to s;
FindWords(sentences, s, empty word, l)
remove w from s
}
FindWords(sentences, s, w, l)
put last letter from w back onto l
}
有,當然,一些優化,你可以執行,使之走的快。例如檢查該單詞是否是詞典中任何單詞的詞幹。但是,這是能給你所有可能的句子的基本方法。
+1非常有趣的問題。我很高興看到這個解決方案,但我想不出來。可以考慮的唯一方法是簡單地瀏覽所有的字母,並在將它與字典比較爲一個完整的單詞時將它切斷,儘管這種方法很快就會失敗。 – DMan 2010-10-21 03:04:50
這也可以解釋爲(「無意識地,無意識地)」鮑勃茶青蘋果「。 – Ferruccio 2010-10-21 03:07:53
@Ferruccio:你已經證明了爲什麼這會充滿麻煩......這只是在這個問題中發佈的示例文本。會有一些真實的例子,它們確實有道理,但仍然是錯誤的。 – 2010-10-21 03:11:34