Solution:
May use DSF. In order to reduce the time complexity, we can pre-build a one dimensional array dp[i] to represents that the sub-string from i to n can be segmented into words.
Code:
class Solution {
public:
vector<string> wordBreak(string s, unordered_set<string>& wordDict) {
vector<string> res;
int l = s.size();
if(!l) return res;
vector<bool> dp(l+1, false);
dp[l] = true;
for(int i=l-1; i>=0; --i){
for(int j=l; j>i; --j){
if(wordDict.find(s.substr(i, j-i)) != wordDict.end() && dp[j]){
dp[i] = true;
break;
}
}
}
wBDSF(s, wordDict, dp, 0, "", res);
return res;
}
private:
void wBDSF(string s, unordered_set<string> &w, vector<bool> &dp, int ind, string t, vector<string> &r){
if(ind == s.size()) r.push_back(t);
else{
for(int i=ind; i<s.size(); ++i){
string t1 = s.substr(ind, i-ind+1);
if(w.find(t1) != w.end() && dp[i+1]){
wBDSF(s, w, dp, i+1, t.empty()?t+t1:t+" "+t1, r);
}
}
}
}
};
No comments :
Post a Comment