动态规划dp —— 25.单词拆分

动态规划dp —— 25.单词拆分_第1张图片1.状态表示

是什么?dp表中里的值所表示的含义就是状态表示

dp[i]表示:[0,i]区间内的字符串,能否被字典中的单词拼接而成(存ture或false)

2.状态转移方程

dp[i] 等于什么

根据最后一个位置,来划分问题(最后n个字符构成一个单词)

设j为最后一个单词起始位置的下标    0 <= j <= i

那么除去最后一个单词剩下的字符串区间就是[0,j-1]

动态规划dp —— 25.单词拆分_第2张图片

 同时满足dp[j-1] == ture 和 [ j , i ]区间在字典中,dp[i] 为ture

否则dp[i]为false

3.初始化

保证填表的时候不越界

当j=0时(把整个字符串当做一个单词)j-1会越界访问

所以dp表在前面加一个辅助节点(虚拟节点)

dp[0] = ture

因为dp表多了一个节点,为了让下标关系一一对应,对应的字符串前多一个空格

4.填表顺序

为了填写当前状态的时候,所需要的状态已经计算过了
 

5.返回值

题目要求+状态表示

6.代码 

class Solution {
public:
    bool wordBreak(string s, vector& wordDict) {
        //优化
        unordered_set hash;
        for(auto e: wordDict) hash.insert(e);

       
        int n = s.size();
        //1.创建dp表
        vector dp (n+1);
        //2.初始化
        dp[0] = true;//保证后面填表是正确的
        s = ' '+s;//原始字符串的下标+1
        //3.填表
        for(int i = 1; i < n+1;i++)
        {
            for(int j =i;j>=1;j--)//最后一个单词的起始位置
            {
                if(dp[j-1] && hash.count(s.substr(j,i-j+1)))
                {
                    dp[i] = true;
                    break;
                }

            }
        }
        //4.返回值
        return dp[n];
    }
};

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