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