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) 来获得相关源码。

你可能感兴趣的:(LeetCode,算法,python,缓存,DFS)