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); } } } } }