140. Word Break II
Problem:
Straight forward DFS is trivial will get TLE. Need to memorize the temp result. Use map<String, List<String>> to cache intermediate results.
Solution:
It's tricky to deal with end of s.
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:
Input: s = "catsanddog
" wordDict =["cat", "cats", "and", "sand", "dog"]
Output:[ "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: []Analysis:
Straight forward DFS is trivial will get TLE. Need to memorize the temp result. Use map<String, List<String>> to cache intermediate results.
Solution:
It's tricky to deal with end of s.
class Solution { public List<String> wordBreak(String s, List<String> wordDict) { return dfs(s, wordDict, new HashMap<String, List<String>>()); } private List<String> dfs(String s, List<String> wordDict, Map<String, List<String>> map) { if (map.containsKey(s)) { return map.get(s); } List<String> res = new ArrayList<>(); if (s.isEmpty()) { res.add(""); return res; } for (String word: wordDict) { if (s.startsWith(word)) { for(String temp: dfs(s.substring(word.length()), wordDict, map)) { res.add(word + (temp.isEmpty() ? "" : " ") + temp); } } } map.put(s, res); return res; } }
评论
发表评论