递归程序打印但未返回正确的值

时间:2019-01-08 01:50:11

标签: python algorithm recursion

我正在尝试解决一个称为单词断https://leetcode.com/problems/word-break/的leetcode问题

给出一个非空字符串s和一个包含非空单词列表的字典wordDict,确定是否可以将s分割为一个或多个字典单词的以空格分隔的序列。

我可以打印适合该解决方案的不同断词,但返回代码时始终返回None。如何解决这个问题,使res是一个数组,其中包含创建s的字典中的不同单词

import sys; 

class Solution:
    def wordBreak(self, s, wordDict):
        res = self.driver(s, 0, len(s), wordDict, [])
        print(res)

    def driver(self, text, start, end, wordDict, res):
        if text[start:end] == None:    
            return res
        elif text[start:end] in wordDict:
            result = text[start:end]
            res.append(result)
            print(res)
            return self.driver(text, end, len(text), wordDict, res)
        else:
            for i in range(start, end):
                self.driver(text, start, i, wordDict, res)

2 个答案:

答案 0 :(得分:1)

您可以检查给定的字符串s是否以wordDict中的任何单词开头,然后递归检查s中的其余字符串是否可以与{中的单词进行分区{1}}:

wordDict

答案 1 :(得分:1)

像这样的递归问题一样,不让递归执行工作会使您变得比必要的难。尽管@blhsing的解决方案很优雅(+1),但让我们使用您的设计,但请简化一下:

class Solution:
    def wordBreak(self, s, wordDict):
        return self.wordBreak_recursive(s, 0, len(s), wordDict)

    def wordBreak_recursive(self, s, start, end, wordDict):

        for index in range(start + 1, end + 1):
            if s[start:index] in wordDict and (index == end or self.wordBreak_recursive(s, index, end, wordDict)):
                return True

        return False

无需收集res中的句段,因为要求是关于是否可以拟合的布尔结果:

solver = Solution()

print(solver.wordBreak("leetcode", ["leet", "code"]))
print(solver.wordBreak("applepenapple", ["apple", "pen"]))
print(solver.wordBreak("catsandog", ["cats", "dog", "sand", "and", "cat"]))

输出

> python3 test.py
True
True
False
> 

类似地,我们不需要找到所有解决方案,只需找到一个解决方案即可。

最后,如果您的递归方法返回一个值,那么每次我们递归调用它时,我们通常都需要解决返回的值,而不是忽略它-即使递归方法通过在其调用者的变量中修改变量来保护结果。环境。否则,也许它不应该返回任何东西。