139.单词拆分
. - 力扣(LeetCode)
题目分析
-
初始化:初始化一个布尔型向量
dp
,大小为s.size() + 1
,所有值初始化为false
,除了dp[0]
被设置为true
。这个布尔数组代表字符串s[0..i]
能否通过拼接字典中的单词来形成。dp[0] = true
的原因是一个空字符串总是可以被形成。 -
转换wordDict:输入的
wordDict
被转换成一个无序集合wordset
,以便高效查找单词。 -
动态规划循环:代码使用两个嵌套循环来填充
dp
数组:- 外循环从
1
迭代到s.size()
,包含。这表示当前考虑的子字符串的长度。 - 内循环从
0
迭代到s.size()
,包含。这表示被考虑的子字符串的起始索引。 - 对于每对
(i, j)
,其中i > j
,代码检查子字符串s[j, i-j]
(代表s
从j
开始长度为i-j
的子字符串)是否在wordset
中,以及dp[j]
是否为true
。如果这两个条件都满足,意味着当前的子字符串s[j, i-j]
可以通过拼接字典中的单词来形成,并且j
之前的子字符串也形成了有效序列,所以将dp[i]
设置为true
。
- 外循环从
-
打印
dp
数组:在DP表填充完成后,代码打印了dp
数组的值,显示在每个索引i
处,子字符串s[0..i-1]
是否可以被分割成一个或多个字典中的单词。 -
返回值:最后,返回
dp[s.size()]
,表示整个字符串s
是否可以被分割成一个序列的字典单词
acm模式代码
#include <iostream>
#include <vector>
#include <string>
#include <unordered_set>class Solution {
public:bool wordBreak(std::string s, std::vector<std::string>& wordDict) {std::vector<bool> dp(s.size() + 1, false);dp[0] = true;std::unordered_set<std::string> wordset(wordDict.begin(), wordDict.end());for (int i = 1; i <= s.size(); i ++) {for (int j = 0; j <= s.size(); j ++) {if (i > j) {if (wordset.find(s.substr(j , i - j)) != wordset.end() && dp[j] ) {dp[i] = true;}}}}for (auto i: dp) std::cout << i << " " ;std::cout << std::endl;return dp[s.size()];}
};int main() {Solution sol;std::string s = "leetcode";std::vector<std::string> wordDict = {"leet", "code"};bool res = sol.wordBreak(s, wordDict);std::cout << "res:" << res << std::endl;
}
多重背包了解
代码随想录
背包问题总结
代码随想录