bool valid(tr1::unordered_set<string> const& st, sbmt::fat_syntax_rule const& r) { vector<string> v; keys(*r.lhs_root(),v); BOOST_FOREACH(string const& vv, v) { if (st.find(vv) == st.end()) return false; } return true; }
bool wordSegmentation(string s, tr1::unordered_set<string> &dict) { // write your code here if (s.size() == 0) { return true; } vector<bool> res; res.push_back(true); int maxWordLen = 0; for (tr1::unordered_set<string>::iterator i = dict.begin(); i != dict.end(); i++) { int curSize = (*i).size(); if (curSize > maxWordLen) { maxWordLen = curSize; } } //cout << "maxWordLen is " << maxWordLen << endl; for (int i = 0; i < s.size(); i++) { bool seged = false; for (int j = (i - maxWordLen > 0) ? (i - maxWordLen) : 0; j <= i; j++) { string subs = s.substr(j, i - j + 1); tr1::unordered_set<string>::const_iterator got = dict.find(subs); if (got != dict.end()) { if (res[j]) { seged = true; break; } } } if (seged) { res.push_back(true); } else { res.push_back(false); } } // int lastSegedPos = -1; // for(int i = 0; i < s.size(); i++) // { // string subs = s.substr(lastSegedPos + 1, i - lastSegedPos); // cout << "current i is " << i << endl; // cout << "subs is " << subs << endl; // tr1::unordered_set<string>::const_iterator got = dict.find(subs); // if (got != dict.end()) // { // cout << "lastSegedPos changed from " << lastSegedPos << " to " << i << endl; // res.push_back(true); // lastSegedPos = i; // } // else // { // res.push_back(false); // } // } // for (int i = 0; i < s.size(); i++) // { // bool seged = false; // for (int j = 0; j <= i; j++) // { // string subs = s.substr(j, i - j + 1); // tr1::unordered_set<string>::const_iterator got = dict.find(subs); // if (got != dict.end()) // { // if (res[j]) // { // seged = true; // break; // } // } // } // if (seged) // { // res.push_back(true); // } // else // { // res.push_back(false); // } // } return res[s.size()]; }