思路:动态规划问题,设一个状态数组ret[i]表示从字符串s的子字符串s[0,...,i]是否可以分解成字典中的单词,如果在,则ret[i] = true,求解这个子字符串的是否可分解,需要考虑以i 结尾的每个子字符串是否在字典中,即设 j = 0, ..., i,如果ret[j-1] = true,而且 s[j...i] 是字典中的一个单词,则ret[i] = true。当然需要考虑j == 0 情况。
所以,状态转移公式为: ret[i] = ∪(ret[j-1] && s[j...i] ∈dict)
code:
class Solution {
public:
bool wordBreak(string s, unordered_set<string> &dict) {
int len = s.length();
bool ret[len];
for(int i = 0;i<len;i++)
ret[i] = false;
for(int i = 0;i < len;i++){
for(int j = 0;j <= i;j++){
string temp = s.substr(j,i-j+1);
bool findFlag = find(dict.begin(),dict.end(),temp) != dict.end();
if(findFlag && (j-1 >=0 && ret[j-1] || j == 0))
ret[i] = true;
}
}
return ret[len-1];
}
};