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

【算法日记】Day 4 一维动态规划基础(按字符DP)

Abstract#动态规划#一维DP#子序列#按字符DP

1. 题目

  • 题目:LeetCode 940:不同的子序列 II
  • 核心思路:用all记录当前所有不同的子序列总数(包含空串),cnt[26]记录以每个字母结尾的子序列个数。每遍历一个字符ch,新增的子序列数curNew = all - cnt[ch](即之前所有子序列后面加上ch,再减去已经以ch结尾的重复部分)。然后更新allcnt[ch]。最后返回all - 1(去掉空串)。
  • 复杂度:时间复杂度O ( n ) O(n)O(n),空间复杂度O ( 26 ) = O ( 1 ) O(26) = O(1)O(26)=O(1)

2. 代码

classSolution{public:constintMOD=1000000007;intdistinctSubseqII(string s){vector<int>cnt(26,0);// 按字符DP:以每个字母结尾的不同子序列个数intall=1;// 所有不同子序列总数(包括空串)for(charch:s){intidx=ch-'a';intnewSeq=(all-cnt[idx]+MOD)%MOD;// 严格新增的子序列数all=(all+newSeq)%MOD;cnt[idx]=(cnt[idx]+newSeq)%MOD;}return(all-1+MOD)%MOD;// 去掉空串}};

3. 心得

  • 状态转移选择:这道题一反常规,不以位置为转移状态,而是以字符为视角。如果坚持按位置 DP(比如 dp[i] 表示前 i 个字符的不同子序列数),去重会非常困难。注意到每一轮的重复子序列事实上仅依赖于当前字母,因此从字符角度记录以每个字母结尾的子序列个数才是关键,这样一来就能在再次遍历到某一字母时能够直接从上一次遇到该字母时的情况得出当前轮会有多少重复子串。

  • 核心逻辑:做题时自己已经想到了以当前字符结尾的子序列是在上一轮已有子串基础上生成的,但这种仅从位置角度考虑状态转移的思路只能得出未去重的子序列数,阻塞了解题思路。结合字符角度的状态转移思考,不难得出去重思路——当前轮严格新增子序列数 = 所有已有子序列(包括空串)后面拼接当前字符减去之前已经以该字符结尾的子序列数。再用新增子序列数更新所有已有子序列数和以该字符结尾的子序列数。

  • 空串处理:all初始为 1(代表空串),最后返回all - 1去掉空串。容易忘记取模导致负数,正确写法(all - 1 + MOD) % MOD

  • 取模的坑:加减法取模将结果限制在[ 0 , M O D ] [0, MOD][0,MOD]范围内。

4. 相关题目

LeetCode 467:环绕字符串中的唯一子字符串

http://www.jsqmd.com/news/583871/

相关文章:

  • 技术创业中的产品迭代:从内核开发到用户中心
  • 创意随笔:智能转录便携终端
  • 告别图层导出烦恼:智能高效的Photoshop批量处理工具如何提升设计效率
  • 折腾光纤模型的手记
  • 智慧城市落地难?这4个痛点,90%项目都踩过
  • 基于[ClaudeCode]源码魔改重建深度集成微信消息桥使微信用户可直接与 Claude 对话,Claude 也可主动向微信用户发送文字、图片和文件
  • MS5540C传感器驱动开发:类SPI协议与校准算法详解
  • LeetCode hot 100 (8-11,自用2026.04.03)
  • Spring Boot注解大赏:40个常用注解助你一臂之力
  • 嵌入式开发中的策略模式应用与优化
  • 探索脊髓损伤与性别差异的统计分析
  • 【数据结构与算法】第24篇:哈夫曼树与哈夫曼编码
  • Cypress是什么
  • 告别token焦虑,Claude Code 本地免费运行
  • 学术研究利器:OpenClaw+千问3.5-9B自动整理文献综述
  • OpenClaw错误处理:gemma-3-12b-it任务失败自动恢复机制
  • 别让APP名字和图标毁了你的Toast!一招教你Android优化技巧
  • 2026-04-02 打卡第 2 天
  • 技术创业中的风险管理:从内核开发到商业稳定
  • JavaScript是什么
  • CSS高频八股
  • 密胺餐具批发新选择:为何河北悦源贸易有限公司成为餐饮采购的可靠伙伴? - 2026年企业推荐榜
  • 百度网盘提取码智能解析:解决资源获取痛点的自动化方案
  • 【数据结构】线索二叉树之中序遍历线索化详解与实现
  • 2026最权威的六大AI论文网站解析与推荐
  • Arduino多板型编译期引脚元数据库:variants_collector
  • 技术创业中的技术创新:从内核开发到商业价值
  • OpenClaw安全审计:Qwen3-32B私有镜像下的操作日志与回滚机制
  • 2026届学术党必备的六大AI辅助论文神器推荐
  • OpenClaw安全防护方案:Gemma-3-12b-it任务执行权限管控