Given a string s and a dictionary of words dict, add spaces in s to construct a sentence where each word is a valid dictionary word.
Return all such possible sentences.
For example, given
s = "catsanddog"
,
dict = ["cat", "cats", "and", "sand", "dog"]
.
A solution is ["cats and dog", "cat sand dog"]
.
For the "Return all " problems, usually DFS or BFS will work well.
In this problem, a DFS with a simple cutting edge condition will pass all the test cases.
The idea is to use mp[][] array to record which substring is in dict. and a array to record the insert index
for those substrings, we use DFS.
c++
class Solution {
public:
void dfsWordBreak(string &s,
int st,
vector<int>&sp,
unordered_set<string> &dict,
vector<string> &result,
vector<vector<bool>> &mp){
if(st>=s.size()){
string str = s;
for(int i=0;i<sp.size()-1;i++){
str.insert(sp[i]+i," ");
}
result.push_back(str);
}else{
for(int j=0;j<mp[st].size();j++){
if(mp[st][j]==true){
sp.push_back(j+1);
dfsWordBreak(s,j+1,sp,dict,result,mp);
sp.pop_back();
}
}
}
}
vector<string> wordBreak(string s, unordered_set<string> &dict) {
vector<string> result;
vector<vector<bool>> mp(s.size(),vector<bool>(s.size(),false));
for(int i=0;i<s.size();i++){
for(int j=i;j<s.size();j++){
if(dict.find(s.substr(i,j-i+1))!=dict.end())
mp[i][j] = true;
}
}
bool flag = false;
for(int i=0;i<s.size();i++){
if(mp[i][s.size()-1])
{flag = true;
break;}
}
if(!flag) return result;
vector<int>sp;
dfsWordBreak(s,0,sp,dict,result,mp);
return result;
}
};
Java
public class Solution {
List<String> result;
List<Integer> solu;
boolean [][] mp;
public List<String> wordBreak(String s, Set<String> dict) {
result = new ArrayList<>();
solu = new ArrayList<>();
mp = new boolean[s.length()][s.length()];
for(int i=0;i<s.length();i++){
for(int j=i;j<s.length();j++){
if(dict.contains(s.substring(i, j+1)))
mp[i][j] = true;
}
}
boolean flag = false;
for(int i=0;i<s.length();i++){
if(mp[i][s.length()-1]){
flag = true;
break;
}
}
if(!flag) return result;
dfs(s, 0, dict);
return result;
}
public void dfs(String s, int st, Set<String> dict ){
if(st>=s.length()){
StringBuffer str = new StringBuffer(s);
for(int i=0;i<solu.size()-1;i++){
str.insert(solu.get(i)+i, " ");
}
result.add(str.toString());
}else {
for(int j=0;j<mp[st].length;j++){
if(mp[st][j]==true){
solu.add(j+1);
dfs(s, j+1, dict);
solu.remove(solu.size()-1);
}
}
}
}
}