【Leetcode】完全背包问题-139. 单词拆分

【Leetcode】完全背包问题-139. 单词拆分

题目

给你一个字符串 s 和一个字符串列表 wordDict 作为字典。请你判断是否可以利用字典中出现的单词拼接出 s 。

注意:不要求字典中出现的单词全部都使用,并且字典中的单词可以重复使用。

思路

  • 确定dp数组以及下标的含义:dp[i] = true 表示从字符串第0个位置到第i个位置一定能找到字典中的一个字符串
  • 确定递推公式:如果dp[j]是true,(j是一个分割点)并且[j,i]区间的字符串出现在字典里,那么dp[i] = true
  • dp数组初始化,dp[0] = true,其他下标全部初始化为false
  • 这道题没有要求求解多少种方法,所以先遍历背包还是先遍历物品都是可以的

代码

class Solution {
public:
    bool wordBreak(string s, vector<string>& wordDict) {
        // 单词就是物品  字符串s就是背包 单词能否组成字符串s 就是问物品能不能把背包装满
        unordered_set<string> wordSet(wordDict.begin(),wordDict.end());
        // 确定dp数组以及下标的含义
        // dp[j] 表示字符串长度为j  如果dp[j] = true  表示可以拆分成一个或者多个字典中出现的单词
        // dp[j]表示从字符串第0个位置到第j个位置一定能找到 记为True
        vector<int> dp(s.size() + 1,false);
        dp[0] = true;

        // 确定遍历顺序 不要在乎是组合还是排列 因为不是求方法总数
        // 先遍历背包 在遍历物品
        for(int i = 1; i <= s.size();i++)
        {
            for(int j = 0; j < i; j++)
            {
                // 截取子字符串
                string word = s.substr(j,i - j);

                if(wordSet.find(word) != wordSet.end() && dp[j])
                {
                    dp[i] = true;
                }
            }
        }

        return dp[s.size()];

    }
};

你可能感兴趣的:(#,Leetcode,Algorithm,leetcode,动态规划,算法)