让你的压实文档的长度为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