1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
|
class Solution {
public:
bool **map;
set<int> wordlens;
vector<string> result;
vector<string> wordBreak(string s, unordered_set<string> &dict) {
wordlens.clear();
unordered_set<string>::iterator it;
for(it = dict.begin(); it != dict.end(); it++) {
string itstr = *it;
wordlens.insert(itstr.length());
}
result.clear();
map = new bool*[s.length()];
for(int i = 0; i < s.length(); i++) {
map[i] = new bool[s.length()];
for(int j = 0; j < s.length(); j++) {
map[i][j] = false;
}
}
for(int start = 0; start < s.length(); start++) {
for(int len = 1; len <= s.length() - start; len++) {
string tmp = s.substr(start, len);
if(dict.find(tmp) != dict.end()) {
map[start][start + len - 1] = true;
}
}
}
for(int i = 0; i < s.length(); i++) {
for(int j = 0; j <= i; j++) {
for(int k = j; k < i; k++) {
if(map[j][k] && map[k + 1][i]) map[j][i] = true;
}
}
}
// for(int i = 0; i < s.length(); i++) {
// for(int j = 0; j < s.length(); j++) {
// cout << map[i][j] << ' ';
// }
// cout << endl;
// }
if(map[0][s.length() - 1] == false) return result;
string item = "";
findSen(s, 0, dict, item);
return result;
}
private:
void findSen(string &s, int start, unordered_set<string> &dict, string &item) {
if(start >= s.length()) {
result.push_back(item);
return;
}
set<int>::iterator it;
for(it = wordlens.begin(); it != wordlens.end(); it++) {
int len = *it;
if(start + len > s.length()) return;
string tmp = string(s, start, len);
if(dict.find(tmp) != dict.end()) {
string itembp = item;
if(start != 0) item += " ";
item += tmp;
findSen(s, start + len, dict, item);
item = itembp;
}
}
}
};
|