Given a string s and a dictionary of words dict, determine if s can be segmented into a space-separated sequence of one or more dictionary words.
// DFS solution
bool dfs(string s, unordered_set<string> &dict, int start_idx) {
if(start_idx >= s.size()) return true;
for(int j=start_idx; j<s.size(); j++) {
string t = s.substr(start_idx, j-start_idx+1);
if(dict.find(t) == dict.end()) continue;
if(dfs(s, dict, j+1)) return true;
}
return false;
}
bool wordBreak(string s, unordered_set<string> &dict) {
return dfs(s, dict, 0);
}
// DP solution. Note, the indices are hard to understand in some sense! Be very careful!
bool word_break_DP(string s, unordered_set<string> &dict) {
if(s.empty()) return true;
if(dict.empty()) return false;
vector<bool> F(s.size()+1, false);
F[0] = true;
for(int i=1; i<=s.size()+1; i++) {
for(int j=i-1; j>=0; j--) {
// 为何是f[j] 而不是f[j-1]? 因为f的长度是s.size()+1, f[j]指的是从0到j-1的字符串的bool值
if(F[j] && dict.find(s.substr(j, i-j)) != dict.end())
F[i] = true;
break;
}
}
return F[s.size()];
}