题目:
代码(首刷看解析 2024年2月28日):
class Solution {
public:
// 动态规划
bool wordBreak(string s, vector<string>& wordDict) {
int n = s.size();
// 初始化dp[i]
vector<int> dp(n + 1, false);
dp[0] = true;
// 遍历 排列 先n再wordDict
for (int i = 1; i <= n; ++i) {
for (int j = 0; j < i; ++j) {
string word = s.substr(j , i - j);
if (find(wordDict.begin(), wordDict.end(), word) != wordDict.end() && dp[j] == true)
dp[i] = true;
}
}
return dp[n];
// 递归公式:if (子字符 在 wordDict 中存在,且 dp[j] == true) dp[i] == true;
}
};
代码(二刷看解析 2024年3月10日)
不太明白我在if中写成这样为什么不能通过测试,有知道的读者如果看到了能给我解释一下,我请你喝蜜雪冰城(虽然不太可能有人能看到)
if (find(wordDict.begin(), wordDict.end(), word) != wordDict.end()) {
dp[i] = dp[j - 1];
}
class Solution {
public:
bool wordBreak(string s, vector<string>& wordDict) {
int n = wordDict.size();
vector<bool> dp(s.size() + 1, false);
s.insert(s.begin(),' ');//添加一个空格占位
dp[0] = true;
for (int i = 1; i <= s.size(); ++i) {
for (int j = 1; j <= i; ++j) {
string word = s.substr(j, i - j + 1);
if (find(wordDict.begin(), wordDict.end(), word) != wordDict.end() && dp[j - 1] == true) {
dp[i] = true;
}
}
}
return dp[s.size()];
}
};