【Hot 100】139. 单词拆分
目录
- 引言
- 单词拆分
- 我的解题
- 🙋♂️ 作者:海码007
- 📜 专栏:算法专栏
- 💥 标题:【Hot 100】139. 单词拆分
- ❣️ 寄语:书到用时方恨少,事非经过不知难!
引言
继续dp算法刷题。
单词拆分
- 🎈 题目链接:
- 🎈 做题状态:
我的解题
解题思路:因为当前字符串能否拆分可以由前面子串能够拆分的状态推导过来,所以采用dp的方法来求解。
dp[i] 表示前 i 个元素组成的子串能否拆分
dp[0] 表示空字符串,等于 true ,能被拆分
dp[i] 的计算需要遍历字典中每个字符串进行匹配。匹配的时候也需要将 s 的子串进行拆分,因为字典中的字符串可以只匹配后半段,前半段的状态沿用 dp[i-len] 即可。只有当 s.substr(i - len, len) 和 wordDict[j] 相等并且 dp[i - len] 也为 true 时,当前的子串才能进行拆分。
class Solution {
public:bool wordBreak(string s, vector<string>& wordDict) {// dp数组初始化,dp[i]表示s的前i个字符能否被拆分vector<bool> dp(s.size() + 1, false); // 注意这里应该是bool类型dp[0] = true; // 空字符串可以被拆分// 遍历字符串的每个位置for (int i = 1; i <= s.size(); ++i) // 修改为<=,因为dp.size()=s.size()+1{// 遍历字典中的每个单词for (const string& word : wordDict) // 使用引用避免拷贝{int len = word.size();// 如果当前子串长度小于单词长度,跳过if (i < len) continue;// 检查:// 1. 当前子串的后len个字符是否匹配字典单词// 2. 前面的子串(i-len长度)是否可被拆分if (s.substr(i - len, len) == word && dp[i - len]){dp[i] = true;break; // 找到一个匹配即可跳出循环}}}return dp[s.size()]; // 返回整个字符串的拆分结果}
};