leetcode 139. 单词拆分

leetcode 139. 单词拆分

题目描述

给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。

说明:
拆分时可以重复使用字典中的单词。
你可以假设字典中没有重复的单词。

举例:
输入: s = “leetcode”, wordDict = [“leet”, “code”]
输出: true
解释: 返回 true 因为 “leetcode” 可以被拆分成 “leet code”。

题目分析
  1. 看到题目后首先一个naive的想法就是遍历求解,针对每一个可能空格出现的位置进行递归,看是否满足题目要求的拆分标准,例如以下代码
def wordBreak(s, wordDict):
    """
    :type s: str
    :type wordDict: List[str]
    :rtype: bool
    """
    if not s:
        return
    elif s in wordDict:
        return True
    res = [False]
    def recur_find(string):
        if res[0] is True:
            return
        if not string:
            res[0] = True
        for i in range(1, len(string)+1):
            if string[:i] in wordDict:
                recur_find(string[i:])
    recur_find(s)
    return res[0]
  1. 然而遍历求解没有考虑到例如“aaaaaaaaabcaaaaa", [“a”,“aa”]这样的重复字符问题,要注意想取巧是很难做到的,所以就考虑使用动态规划来解决。涉及一个matrix,matrix 纬度为[len(string),len(string)], matrix[i][j]表示string的第i个字符到第j个字符的子字符串在字典中,注意我们最终的答案是在matrix[0][-1]这里,所以在迭代计算matrix[i][j]时要更新matrix[0][i]的结果
最终代码
    def wordBreak(self, s, wordDict):
        """
        :type s: str
        :type wordDict: List[str]
        :rtype: bool
        """
        matrix = [[0 for _ in xrange(len(s))] for _ in xrange(len(s))]
        for i in xrange(len(matrix)):
            for j in xrange(i,len(matrix)):
                if s[i:j+1] in wordDict:
                    matrix[i][j] = 1
                    if matrix[0][i-1] == 1 and i > 0:
                        matrix[0][j] = 1
        return True if matrix[0][-1] == 1 else False

题目来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/word-break
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值