讓你的壓實文檔的長度爲N.
令B(n)是一個布爾值:如果該文檔可以被分成從位置n處的文檔中開始的話。
b(N)爲真(因爲空字符串可以分成0個字)。給定b(N),b(N-1),... b(N-k),你可以通過考慮以字符N - k - 1開始的所有單詞來構造b(N - k - 1)有b(N - k - 1 + len(w))集,然後將b(N - k - 1)設爲真。如果沒有這樣的單詞,則將b(N - k - 1)設置爲false。
最終,您計算b(0),它告訴您是否可以將整個文檔拆分爲單詞。
在僞代碼:
def try_to_split(doc):
N = len(doc)
b = [False] * (N + 1)
b[N] = True
for i in range(N - 1, -1, -1):
for word starting at position i:
if b[i + len(word)]:
b[i] = True
break
return b
有一些技巧,你可以做的就是「字開始位置i」高效,但你要求的O(N^2)算法,所以你可以查找字典中從i開始的每個字符串。
要生成的話,就可以修改上述算法來存儲好詞語,或只是產生這樣的:
def generate_words(doc, b, idx=0):
length = 1
while true:
assert b(idx)
if idx == len(doc): return
word = doc[idx: idx + length]
if word in dictionary and b(idx + length):
output(word)
idx += length
length = 1
這裏b是該算法的第一部分產生的布爾數組。
那麼,這是一本教科書的練習。我沒有解決方案,我不知道如何解決這個問題。 – Pet
想到的第一件事 - 模棱兩可。假設你的字典有單詞「是」,「她」和「洗衣機」。不過,你可以選擇最短的單詞。等等,不......你可以從單詞中剔除一部分,並渲染字符串無效 - 就像從'自動'中捕獲'auto'一樣。 – alxx
您是否嘗試先搜索答案?關於這個問題已經很少有問題了 - http://stackoverflow.com/questions/4755157/split-string-into-words,http://stackoverflow.com/questions/3553958/tokenize-valid-words-from -a-long-string,http://stackoverflow.com/questions/3466972/how-to-split-a-string-into-words-ex-stringintowords-string-into-words。其中一些提到動態編程解決方案。 – hoha