class Solution {
public:
bool wordBreak(string s, vector<string>& wordDict) {
if (s.empty() || wordDict.empty()) return false;
unordered_set<string> dic;
for (int i = 0; i < wordDict.size(); ++i) {
dic.insert(wordDict[i]);
}
bool* dp = new bool[s.length()+1];
for (int i = 0; i < s.length()+1; ++i) dp[i] = false;
dp[0] = true;
for (int i = 1; i <= s.length(); ++i) {
for (int j = 0; j < i; ++j) {
if (dp[j] && dic.find(s.substr(j, i - j))!=dic.end()) {
dp[i] = true;
break;
}
}
}
return dp[s.length()];
}
};