考察点:dp;
思路:dp总是那么难想。关键是要搞清楚dp【i】表示的是什么, 这里的dp【i】表示的就是问题:即s的前i个字符可以由set1内的字符串表示出来吗?方法是两个循环,外层是从s的第一个位置1到最后位置len;内层循环是遍历set1中的所有string,看第i个位置是否符合要求。
C++代码:
class Solution {
public:
bool wordBreak(string s, vector<string>& wordDict) {
set<string> set1;
for (auto i : wordDict) {
set1.insert(i);
}
int len = s.size();
bool dp[len+1];
memset(dp, 0, sizeof(dp));
dp[0] = true;
for (int i=1; i<=len; i++) {
for (string sub : set1) {
if (sub.size() <= i) {
if (dp[i - sub.size()]) {
if (sub == s.substr(i-sub.size(), sub.size())) {
dp[i] = true;
break;
}
}
}
}
}
return dp[len];
}
};