代码随想录算法训练营第四十六天 | 139.单词拆分

文章目录

  • 一、139.单词拆分


一、139.单词拆分

题目链接

本题要注意以下几点:
1)先遍历背包再遍历物品,因为正确的单词拆分是强调顺序的,apple+pen+apple是正确的,而apple+apple+pen是错误的;
2)dp[0]不对应字符,是人为加上去的。题目中明确了是非空字符串s,测试数据中不会出现i为0的情况,因此dp[0]初始化为true是为了推导递推公式;
3)遍历背包时,i从1开始。dp[1]对应第一个字符,dp[s.size()]对应最后一个字符。

代码如下:

class Solution {
public:
    bool wordBreak(string s, vector<string>& wordDict) {
        unordered_set wordSet(wordDict.begin(), wordDict.end());
        vector<bool> dp(s.size() + 1, false);
        dp[0] = true;
        for (int i = 1; i <= s.size(); i++) { // 先遍历背包(排序)dp从1开始(0已经定义过了,dp[0]是多加的)dp[1]才是对应第一个字符,dp[s.size()]对应最后一个字符
            for (int j = 0; j < i; j++) { 
                string word = s.substr(j, i - j); // 截取j+1到i的字符子串
                if (wordSet.find(word) != wordSet.end() && dp[j] == true) {
                    dp[i] = true;
                }
            }
        }
        return dp[s.size()];
    }
};

你可能感兴趣的:(算法)