zoukankan      html  css  js  c++  java
  • 【leetcode】140. Word Break II

    题目如下:

    解题思路:巨坑的一个题目。一般来说,leetcode这一类题目分为两种形式,一种是问能不能分割/有几种分割的方法,一种是列出所有分割的集合。本题是第二种,但是有一些特别坑的用例,其结果是无法分割,又非常容易超时。因此解题方法需要先判断能不能分割,能的话再计算怎么分割。首先看能不能分割:可以采用动态规划的方法。记dp[i] = 0表示s[0:i]区间不能分割,dp[i] = 1表示可以,我们可以得出这样的递推表达式,dp[i] = dp[j] if dp[j] == 1 and s[j+1:i+1] in wordDict,这样能很容易判断出s是否可以被分割;接下来是找出所有分割的集合,同样用动态规划的方法,记dp[i]表示s[0:i]区间所有分割的集合,那么有:dp[i] = dp[j] * s[j+1:i+1] if len(dp[j]) > 0 and s[j+1:i+1] in wordDict。

    代码如下:

    class Solution(object):
        def wordBreak(self, s, wordDict):
            dic = {}
            dp = [0] * len(s)
            for i in wordDict:
                dic[i] = 1
    
            for i in range(len(s)):
                if s[:i+1] in dic:
                    dp[i] = 1
                    continue
                for j in range(i+1):
                    if dp[j] > 0 and s[j+1:i+1] in dic:
                        dp[i] = 1
                        break
            if dp[-1] == 0:
                return []
    
            dp = [[] for i in s]
            for i in range(len(s)):
                if s[:i+1] in dic:
                    dp[i].append(s[:i+1])
                for j in range(i+1):
                    if len(dp[j]) > 0 and s[j+1:i+1] in dic:
                        for k in dp[j]:
                            length = len(k.replace(' ',''))
                            dp[i].append(k + ' ' + s[length:i+1])
            return dp[-1]
  • 相关阅读:
    Windows Server 2012上PHP运行环境搭建的简易教程(Win08适用)
    Windows 8.1 系统ISO镜像下载或自Win8应用商店升级方法
    dojo布局(layout)
    dojo创建tree
    Postgres SQL学习笔记
    PostGIS ShapeFile 导入数据
    利用 PortableBasemapServer 发布地图服务
    Fortran 笔记
    ArcMap 操作笔记
    gdal编译C#开发版本
  • 原文地址:https://www.cnblogs.com/seyjs/p/9549083.html
Copyright © 2011-2022 走看看