zoukankan      html  css  js  c++  java
  • [leetcode]Word Break II @ Python

    原题地址:https://oj.leetcode.com/problems/word-break-ii/

    题意:

    Given a string s and a dictionary of words dict, add spaces in s to construct a sentence where each word is a valid dictionary word.

    Return all such possible sentences.

    For example, given
    s = "catsanddog",
    dict = ["cat", "cats", "and", "sand", "dog"].

    A solution is ["cats and dog", "cat sand dog"].

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

    代码:

    class Solution:
        # @param s, a string
        # @param dict, a set of string
        # @return a list of strings
        def check(self, s, dict):
            dp = [False for i in range(len(s)+1)]
            dp[0] = True
            for i in range(1, len(s)+1):
                for k in range(0, i):
                    if dp[k] and s[k:i] in dict:
                        dp[i] = True
            return dp[len(s)]
            
        def dfs(self, s, dict, stringlist):
            if self.check(s, dict):
                if len(s) == 0: Solution.res.append(stringlist[1:])
                for i in range(1, len(s)+1):
                    if s[:i] in dict:
                        self.dfs(s[i:], dict, stringlist+' '+s[:i])
        
        def wordBreak(self, s, dict):
            Solution.res = []
            self.dfs(s, dict, '')
            return Solution.res
  • 相关阅读:
    DFS 之 全排列
    蓝桥杯: 标题:第几个幸运数
    第K个幸运数字(4、7)
    C++将十进制数转化为二进制
    C++中数组声名后不初始化,数组里的值都是0吗?
    html和jsp区别
    中缀表达式转换为后缀表达式
    多个Activity之间共享数据的方式
    Jupyter Notebook入门教程
    Android之Activity生命周期详解
  • 原文地址:https://www.cnblogs.com/zuoyuan/p/3760804.html
Copyright © 2011-2022 走看看