当前位置: 首页 > news >正文

【学会动态规划】环绕字符串中唯一的子字符串(25)

目录

动态规划怎么学?

1. 题目解析

2. 算法原理

1. 状态表示

2. 状态转移方程

3. 初始化

4. 填表顺序

5. 返回值

3. 代码编写

写在最后:


动态规划怎么学?

学习一个算法没有捷径,更何况是学习动态规划,

跟我一起刷动态规划算法题,一起学会动态规划!

1. 题目解析

题目链接:467. 环绕字符串中唯一的子字符串 - 力扣(LeetCode) 

这道题目也很好理解,读一遍基本就理解了,就是找他给的示例中,

有多少不同的非空子串在 base 里出现,base 就是 a ~ z a ~ z 的一个无线循环。

2. 算法原理

1. 状态表示

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

2. 状态转移方程

这里就可以分成两种情况:

如果长度为1,则 dp[ i ] = 1

如果长度大于 1 ,证明 i 位置与前面的位置结合了,那么如果:

s[ i - 1 ] + 1 == s[ i ] || ( s[ i - 1 ] == 'z' && s[ i ] == 'a' ),dp[ i ] = dp[ i - 1 ]

(之前有多少种情况,现在就有多少种情况)

因为求的是所有的情况的和,所以状态转移方程就是:

dp[ i ] = 1 + s[ i - 1 ] + 1 == s[ i ] || ( s[ i - 1 ] == 'z' && s[ i ] == 'a' ) ? dp[ i ] = dp[ i - 1 ] : 0

3. 初始化

因为每个字母一定会出现,所以我们可以直接把数组初始化成 1 ,

这样我们的状态转移方程就不用多加那个 1 了。

4. 填表顺序

从左往右。

5. 返回值

因为可能会出现字母重复的情况,所以我们不能直接返回所有元素的和,

那我们该怎么去重呢?

相同字符结尾的 dp 值,我们去最大的即可,                

创建一个大小为 26 的数组,里面保存相应字符结尾的最大 dp 值即可。

最后返回数组里的和即可。

3. 代码编写

class Solution {
public:int findSubstringInWraproundString(string s) {int n = s.size();vector<int> dp(n, 1);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];}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;}
};

写在最后:

以上就是本篇文章的内容了,感谢你的阅读。

如果感到有所收获的话可以给博主点一个哦。

如果文章内容有遗漏或者错误的地方欢迎私信博主或者在评论区指出~

http://www.lryc.cn/news/132430.html

相关文章:

  • CNN卷积详解(三)
  • 使用 Amazon Redshift Serverless 和 Toucan 构建数据故事应用程序
  • CentOS 上快速安装包管理工具Conda
  • opencv-手势识别
  • 【SA8295P 源码分析】10 - HQX Display(OpenWFD)qcdisplaycfg_ADP_STAR_LA.xml 配置文件解析
  • 达梦数据库权限和预定角色介绍
  • Python编程从入门到实践_8-8 用户的专辑_答案
  • HummingBird 基于 Go 开源超轻量级 IoT 物联网平台
  • 10.小程序样式
  • Flink 流式读写文件、文件夹
  • 【SA8295P 源码分析】64 - QNX 与 Android GVM 显示 Dump 图片方法汇总
  • 字符串旋转(1)
  • 【SA8295P 源码分析】13 - Android GVM 虚拟机 QUPv3 UART / SPI / I2C功能配置及透传配置
  • STM32 F103C8T6学习笔记10:OLED显示屏GIF动图取模—简易时钟—动图手表的制作~
  • 大数据课程K3——Spark的常用案例
  • 85-最大矩阵
  • 8.3 【C语言】通过指针引用数组
  • 基于Flink CDC实时同步PostgreSQL与Tidb【Flink SQL Client模式下亲测可行,详细教程】
  • Vue-5.编译器Idea
  • qiuzhiji3
  • JVM——垃圾回收(垃圾回收算法+分代垃圾回收+垃圾回收器)
  • QT TLS initialization failed问题(已解决) QT基础入门【网络编程】openssl
  • SpringMVC之获取请求参数
  • 【无标题】QT应用编程: QtCreator配置Git版本控制(码云)
  • JVM面试题-2
  • kafka安装说明以及在项目中使用
  • 二叉树搜索
  • 【先进PID控制算法(ADRC,TD,ESO)加入永磁同步电机发电控制仿真模型研究(Matlab代码实现)
  • k8s集群生产环境的问题处理
  • serve : 无法将“serve”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。