Leetcode: Word Break

Word Break

Given a string s and a dictionary of words dict, determine if s can be segmented into a space-separated sequence of one or more dictionary words.

For example, given
s = “leetcode”,
dict = [“leet”, “code”].

Return true because “leetcode” can be segmented as “leet code”.

It’s just a DP problem, code shows blow:

__author__ = 'phycept'

class Solution:
    def wordBreak(self, s, wordDict):
        contain = [False] * len(s)
        i = -1
        while i < len(s):
            i += 1
            for j in range(i+1,len(s) + 1):
                if wordDict.__contains__(s[i:j]):
                    contain[j - 1] = True
            while i < len(s) and not contain[i]:
                i += 1
        return contain[-1]

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”].

Nearly it’s same as the first one, just add a place to remember the break point, I choose a array of list based on the first problem, code shows below:

__author__ = 'phycept'

class Solution:
    def wordBreak(self, s, wordDict):
        contain = [[] for  i in range(len(s))]
        i = -1
        while i < len(s):
            i += 1
            for j in range(i+1,len(s) + 1):
                if wordDict.__contains__(s[i:j]):
                    contain[j - 1].append(i)
            while i < len(s) and not contain[i]:
                i += 1
        sentence = []
        for b in range(len(contain[-1])):
            sentence += print_word(contain, contain[-1][b], len(s)+1, s)
        return sentence

def print_word(contain, i, j,s):
    ed = ''
    if j != len(contain)+1:
        ed = ' '
    if not i:
        return [s[i:j] + ed]
    lst = []
    for b in range(len(contain[i - 1])):
        pre = print_word(contain, contain[i-1][b], i, s)
        for a in range(len(pre)):
            lst.append(pre[a] + s[i:j]+ed)
    return lst
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值