[Leetcode][python]Word Break/Word Break II

来源:互联网 发布:plsql编程入门 编辑:程序博客网 时间:2024/06/05 20:48

Word Break

题目大意

给定一个目标字符串和一组字符串,判断目标字符串能否拆分成数个字符串,这些字符串都在给定的那组字符串中。

解题思路

动态规划

代码

class Solution(object):    def wordBreak(self, s, wordDict):        """        :type s: str        :type wordDict: List[str]        :rtype: bool        """        n = len(s)        dp = [False] * (n + 1)        dp[0] = True        for i in range(n):            for j in range(i, -1, -1):                # print j, i, s[j:i + 1]                if dp[j] and s[j:i + 1] in wordDict:                    dp[i + 1] = True                    break        return dp[n]

Word Break II

题目大意

给定一个目标字符串和一组单词,将目标字符串进行拆分,要求拆分出的部分在那个单词组中,拆分后的单词用空格隔开,给出所有可能的拆分情况。

解题思路

动态规划+深度优先
参考:http://www.cnblogs.com/zuoyuan/p/3760804.html
这道题不只像word break那样判断是否可以分割,而且要找到所有的分割方式,那么我们就要考虑dfs了。不过直接用dfs解题是不行的,为什么?因为决策树太大,如果全部遍历一遍,时间复杂度太高,无法通过oj。那么我们需要剪枝,如何来剪枝呢?使用word break题中的动态规划的结果,在dfs之前,先判定字符串是否可以被分割,如果不能被分割,直接跳过这一枝。实际上这道题是dp+dfs。

代码

class Solution(object):    def wordBreak(self, s, wordDict):        """        :type s: str        :type wordDict: List[str]        :rtype: List[str]        """        Solution.res = []        self.dfs(s, wordDict, '')        return Solution.res    def dfs(self, s, wordDict, stringlist):        if self.check(s, wordDict):            if len(s) == 0:                 Solution.res.append(stringlist[1:])            for i in range(1, len(s)+1):                if s[:i] in wordDict:                    # print stringlist+' '+s[:i]                    self.dfs(s[i:], wordDict, stringlist+' '+s[:i])    def check(self, s, wordDict):            dp = [False for i in range(len(s)+1)]            dp[0] = True            for i in range(len(s)):                for j in range(i, -1, -1):                    if dp[j] and s[j:i + 1] in wordDict:                        dp[i + 1] = True                        break            return dp[len(s)]

总结

原创粉丝点击