1.状态表示
是什么?dp表中里的值所表示的含义就是状态表示
dp[i]表示:以i位置元素为结尾的所有的子串里面,有多少个在base中出现过
2.状态转移方程
dp[i] 等于什么
如果是单个字母的子串,肯定会在base中出现,所以分为两种情况:
1.长度为1 2.长度大于1
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<int> 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<n;i++)
{
hash[s[i] -'a'] = max( hash[s[i] -'a'],dp[i]);
}
int sum = 0;
for(auto e : hash)
{
sum+=e;
}
return sum;
}
};