140. 单词拆分 II

6 篇文章 0 订阅
2 篇文章 0 订阅

题目:上一题139的加强版
给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,在字符串中增加空格来构建一个句子,使得句子中所有的单词都在词典中。
返回所有这些可能的句子。

我的实现方法是依旧是记忆化回溯,相比上一题加上了句子分割后的拼接。

#!/usr/bin/env python3.6
# _*_coding:utf-8 _*_
# @Time   : 2019/10/29 21:10
# @Author : Grey

from typing import List

class Solution:
    def wordBreak(self, s: str, wordDict: List[str]) -> List[str]:
        n = len(s)
        if n == 0:
            return [""]
        if n == 1 and s in wordDict:
            return [s]
        if n == 1 and s not in wordDict:
            return []

        dic = {}
        for word in wordDict:
            p = s.find(word)
            while p != -1:
                if p not in dic.keys():
                    dic[p] = []
                dic[p].append(p+len(word))
                p = s.find(word, p+1)

        visited = [False for _ in range(n)]
        hasAns = [False for _ in range(n)]
        ans = [[] for _ in range(n)]

        def findBreak(x):
            if visited[x]:
                return hasAns[x]

            if x not in dic.keys():
                visited[x] = True
                return False
            for y in dic[x]:
                if y == n:
                    ans[x].append(s[x:y])
                else:
                    hasAns[y] = findBreak(y)
                    if hasAns[y]:
                        ans[x].extend(s[x:y] + " "+ ss for ss in ans[y])

            visited[x] = True
            hasAns[x] = True
            return hasAns[x]
        findBreak(0)
        return ans[0]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值