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:
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: []
class Solution {
public:
unordered_map<string,vector<string> > dp;
vector<string> wordBreak(string s, vector<string>& wordDict) {
if(dp.find(s)!=dp.end())return dp[s];
vector<string> ans;
for(auto st:wordDict)
{
if(s.substr(0,st.size())==st)
{
if(st.size()==s.size())
{
ans.push_back(st);
}else{
vector<string> tmp =wordBreak(s.substr(st.size(),s.size()-st.size()),wordDict);
for(auto t:tmp)
ans.push_back(st+" "+t);
}
}
}
dp[s]=ans;
return ans;
}
};