LeetCode Word Break II

LeetCode解题之Word Break II


原题

给定一个目标字符串和一组单词,将目标字符串进行拆分,要求拆分出的部分在那个单词组中,拆分后的单词用空格隔开,给出所有可能的拆分情况。

注意点:

例子:

输入: s = “catsanddog”, dict = [“cat”, “cats”, “and”, “sand”, “dog”]

输出: [“cats and dog”, “cat sand dog”]

解题思路

采用深度优先遍历的策略,我们把字符串分为前后两个部分,如果前半部分在单词组中,那么我们就只要递归拆分它的后半部分。那么怎么将字符串分为前后两个部分呢,我们可以直接依次把单词组中的单词与当前字符串的头部进行比较,如果相同,则递归后半部分。

光采用dfs效率低下,因为会有很多重复的情况,假设字符串为abcd...,且我们的单词组中有{a,b,c,ab,bc,abc},那么以d开头的字符串就要被拆分四次。为了避免这样的情况,可以用过哈希的方法来缓存之前已经计算出来的结果。我们通过一个字典来缓存字符串和它对应的拆分结果。

AC源码

import collections


class Solution(object):
    def wordBreak(self, s, wordDict):
        """
        :type s: str
        :type wordDict: Set[str]
        :rtype: List[str]
        """
        dic = collections.defaultdict(list)

        def dfs(s):
            if not s:
                return [None]
            if s in dic:
                return dic[s]
            res = []
            for word in wordDict:
                n = len(word)
                if s[:n] == word:
                    for r in dfs(s[n:]):
                        if r:
                            res.append(word + " " + r)
                        else:
                            res.append(word)
            dic[s] = res
            return res

        return dfs(s)


if __name__ == "__main__":
    assert Solution().wordBreak("catsanddog", {"cat", "cats", "and", "sand", "dog"}) == ['cat sand dog', 'cats and dog']

欢迎查看我的Github (https://github.com/gavinfish/LeetCode-Python) 来获得相关源码。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值