LeetCode 140. Word Break II
原题链接在这里:https://leetcode.com/problems/word-break-ii/
题目:
Given a non-empty string s and a dictionary wordDict containing a list of non-empty words, add spaces in s to construct a sentence where each word is a valid dictionary word. Return all such possible sentences.
Note:
- The same word in the dictionary may be reused multiple times in the segmentation.
- You may assume the dictionary does not contain duplicate words.
Example 1:
catsanddog
["cat", "cats", "and", "sand", "dog"]
[
"cats and dog",
"cat sand dog"
]
Example 2:
Input: s = "pineapplepenapple" wordDict = ["apple", "pen", "applepen", "pine", "pineapple"] Output: [ "pine apple pen apple", "pineapple pen apple", "pine applepen apple" ] Explanation: Note that you are allowed to reuse a dictionary word.
Example 3:
Input: s = "catsandog" wordDict = ["cats", "dog", "sand", "and", "cat"] Output: []
题解:
When it needs all the possible results, it comes to dfs.
Could use memo to prune branches. Use memo means divide and conquer, not iterative.
If cache already has key s, then return list value.
Otherwise, get either head or tail of s, check if it is in the wordDict. If yes, put the rest in the dfs and get intermediate result.
Iterate intermediate result, append each candidate and add to res.
Update cache and return res.
Note: When wordDict contains current s, add it to res. But do NOT return. Since it may cut more possibilities.
e.g. "dog" and "dogs" are both in the result. If see "dogs" and return, it cut all the candidates from "dog".
Time Complexity: exponential.
Space: O(n). stack space O(n).
AC Java:
1 class Solution { 2 Map<String, List<String>> cache = new HashMap<>(); 3 public List<String> wordBreak(String s, List<String> wordDict) { 4 List<String> res = new ArrayList<>(); 5 6 if(s == null || s.length() == 0){ 7 return res; 8 } 9 10 if(cache.containsKey(s)){ 11 return cache.get(s); 12 } 13 14 if(wordDict.contains(s)){ 15 res.add(s); 16 } 17 18 for(int i = 1; i<s.length(); i++){ 19 String tail = s.substring(i); 20 if(wordDict.contains(tail)){ 21 List<String> cans = wordBreak(s.substring(0, i), wordDict); 22 for(String can : cans){ 23 res.add(can + " " + tail); 24 } 25 } 26 } 27 28 cache.put(s, res); 29 return res; 30 } 31 }
AC Python:
1 class Solution: 2 3 def wordBreak(self, s: str, wordDict: List[str]) -> List[str]: 4 cache = {} 5 return self.dfs(s, wordDict, cache) 6 7 def dfs(self, s: str, wordDict: List[str], cache) -> List[str]: 8 if s in cache: 9 return cache[s] 10 11 res = [] 12 if not s: 13 return res 14 15 if s in wordDict: 16 res.append(s) 17 18 for i in range(1, len(s)): 19 tail = s[i:] 20 if tail in wordDict: 21 cans = self.dfs(s[: i], wordDict, cache) 22 for can in cans: 23 res.append(can + " " + tail) 24 25 cache[s] = res 26 return res
类似Word Break.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步