我指的是这个问题:
给定一个字典,即一组字符串和一个字符串s,设计一个 高效的算法,检查s是否是a的串联 字典序列。如果存在这样的连接,那么你的 算法应该输出它。
以下是我如何在不使用DP的情况下解决它:
def getwords(s, start = 0):
# Find a valid word as a prefix, and try to made the rest work
for i in range(start + 1, len(s) + 1):
prefix = s[start:i]
if isind(prefix):
# We used the whole thing, but it's a word!
if i == len(s):
return [prefix]
words = getwords(s, i)
if words:
return [prefix] + words
# We made it to the end without finding a word configuration
return False
记录了DP算法here,以及“编程访谈元素”一书。我的问题是: 为什么?
我找不到任何我的非DP解决方案重新计算相同子问题的实例。谁能解释为什么这个算法不如DP算法?
答案 0 :(得分:2)
会有两个getwords(' adverbqqqqqqqqqqq',6)来电,不是吗?
如果你有类似的东西,它会变得非常讨厌:
... adverbhamstringadverbhamstring adverbhamstringhorsepowerqqq
答案 1 :(得分:1)
据我了解,如果您的w
字母带有n
个字母,并且k
中有w[0:n-1]
个有效字组合(即{{1}可以在不同的地方(w[0:n-1]
次)拆分成有效的单词,你会在字典k
中查找w[n]
次(假设k
不是有效的当然,这个词)。这就是ozangds在他的回答中所表现出来的。
使用动态编程方法,由于您只跟踪字符串有效的索引(可以拆分为单词),因此您只会查找w[n]
一次。
在您发布的链接中查找TulsiRam和geekyandgirly的评论,它们有助于理解问题的两个方面。