动态规划dp —— 26.环绕字符串中唯一的子字符串

动态规划dp —— 26.环绕字符串中唯一的子字符串_第1张图片

1.状态表示

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

dp[i]表示:以i位置元素为结尾的所有的子串里面,有多少个在base中出现过

2.状态转移方程

dp[i] 等于什么

如果是单个字母的子串,肯定会在base中出现,所以分为两种情况:

1.长度为1   2.长度大于1

动态规划dp —— 26.环绕字符串中唯一的子字符串_第2张图片

 dp[i] += dp[i-1](因为dp表都初始化为1,所以直接+=)

3.初始化

保证填表的时候不越界

因为最差情况也有一种,所以只需要把dp表全初始化为1

4.填表顺序

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

从左往右填表

5.返回值

题目要求+状态表示

返回dp表里所有元素的和?(错误,因为会计算上重复的子串)

去重:相同字符结尾的,里面dp值大了累加上,dp值小的直接舍去

1.创建一个大小为26的数组

2.里面的值保存相应字符结尾的最大dp值即可

返回数组里面的和

6.代码

class Solution {
public:
    int findSubstringInWraproundString(string s) {
        int n = s.size();
        //1.创建dp表
        //2.初始化
        vector dp(n,1);
        //3.填表
        for(int i = 1;i < n;i++)
        {
            if(s[i-1]+1==s[i] || s[i-1] =='z' && s[i] == 'a')
            {
                dp[i] += dp[i-1];
            }
        }

        //4.返回值
        int hash [26] = {0};
        for(int i = 0; i

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