Word Break II

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"].

Solution: check before constructing the sentences.

 1 class Solution {
 2 public:
 3     vector<string> wordBreak(string s, unordered_set<string> &dict) {
 4         vector<string> res;
 5         if (!wordBreakPossible(s, dict)) return res; //! not pass if ignoring here
 6         wordBreakRe(s, dict, 0, "", res);
 7         return res;
 8     }
 9     
10     void wordBreakRe(const string &s, const unordered_set<string> &dict, 
11                      int start, string sentence, vector<string> &res) {
12         if (start == s.size()) {
13             res.push_back(sentence);
14             return;
15         }
16         if (start != 0) sentence.push_back(' ');
17         for (int i = start; i < s.size(); ++i) {
18             string word = s.substr(start, i-start+1);
19             if (dict.find(word) == dict.end())
20                 continue;
21             wordBreakRe(s, dict, i+1, sentence + word, res);
22         }
23     }
24     
25     bool wordBreakPossible(const string &s, const unordered_set<string> &dict) {
26         int N = s.size();
27         bool canBreak[N+1];
28         memset(canBreak, false, sizeof(canBreak));
29         canBreak[0] = true;
30         for (int i = 1; i <= N; ++i) {
31             for (int j = i-1; j >= 0; --j) {
32                 if (canBreak[j] && dict.find(s.substr(j, i-j)) != dict.end()) {
33                     canBreak[i] = true;
34                     break;
35                 }
36             }
37         }
38         return canBreak[N];
39     }
40 };

 

posted @ 2014-04-12 02:16  beehard  阅读(175)  评论(0编辑  收藏  举报