Given a non-empty string s and a dictionary wordDict containing a list of non-emptywords, 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: []
#include <iostream>
#include <vector>
#include <unordered_map>
#include <algorithm>
using namespace std;
unordered_map<string, bool> mp;
bool helper(string s, vector<string>& wordDict, string temp, vector<string>& ans){
if(s.length() == 0){
ans.push_back(temp);
return true;
}
if(mp.count(s)){
if(!mp[s])
return false;
}
bool flag = false;
for(auto word : wordDict){
if(s.substr(0, word.size()) == word){
if(helper(s.substr(word.size()), wordDict, temp + " " + word, ans)){
mp[s.substr(word.size())] = true;
flag = true;
}
else
mp[s.substr(word.size())] = false;
}
}
return flag;
}
vector<string> wordBreak(string s, vector<string>& wordDict) {
vector<string> ans;
string temp;
helper(s, wordDict, temp, ans);
for(auto &str : ans){
str.erase(str.begin());
}
return ans;
}