Leetcode 139.单词拆分

文章目录

  • 题目
  • 代码(首刷看解析)

题目

Leetcode 139.单词拆分_第1张图片
Leetcode 139.单词拆分

代码(首刷看解析)

标准的动态规划问题一定是求最值的,因为动态规划类型问题有一个性质叫做「最优子结构」,即从子问题的最优解推导出原问题的最优解。

这种dp作为函数去递归看着有点像DFS,但是又用到了memo,所以可以归纳为DP。只要看见使用备忘录消除重叠子问题,我们一般都称它为动态规划算法。

class Solution {
public:
    vector<int> memo;
    bool wordBreak(string s, vector<string>& wordDict) {
        memo = vector<int>(s.size(), -1);    // -1 代表未计算,0 代表 false,1 代表 true
        return dp(s, wordDict, 0);
    }

    // 虽然像是dfs,但仍然采用了dp的思想,比如拆分成子问题来求解,而且子问题有重叠子问题,加入memo来存储
    bool dp(string& s, vector<string>& wordDict, int n) {
        // base case,整个 s 都被拼出来了
        if(n == s.size())
            return true;
        if(memo[n] != -1)
            return memo[n];
        for(auto& word : wordDict) {
            int len = word.size();
            if(len + n > s.size())
                continue;
            string sub = s.substr(n, len);
            
            if(sub == word && dp(s, wordDict, n+len)) {
                memo[n] = 1;
                return true;
            }
                
        }
        memo[n] = 0;
        return false;
    }
};

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