字符串解码
原题在这里:
概述题意:给定数字字符串,要求可以转换为对应字母字符串的种数。
'A'->1,'B'->2,...'Z'->26
本来写了一个dfs暴力,果然还是TLE了
code:

class Solution { int l, ans; string x; void dfs(int i) { if (i > l || (i < l && x[i] == '0')) return; if (i >= l - 1) { ans++; return; } dfs(i + 1); if (i + 1 < l && ((x[i] - '0') * 10 + x[i + 1] - '0') < 27) dfs(i + 2); } public: int numDecodings(string s) { x = s, l = s.length(); dfs(0); return ans; } };
标准写法还得是动态规划:
定义dp[i]表示[0,i]长度的数字字符串能构成的字母字符串种数
初始化有dp[0]=1
转移方程分析:
因为'0'不能单独构成,所以
dp[i]=dp[i-1],s[i]!='0'
有二位数构成的字母,所以
dp[i]+=dp[i-2],(s[i-1]-'0')*10+s[i]-'0'<27 and s[i-1]!='0'
写完了,最后优化一下边界处理,将初始遍历下标改为1
所以最终code:
class Solution { public: int numDecodings(string s) { int l = s.length(); vector<int> dp(l + 1, 0); dp[0] = 1; for (int i = 1; i <= l; ++i) { if (s[i - 1] != '0') dp[i] += dp[i - 1]; if (i > 1 && s[i - 2] != '0' && (s[i - 2] - '0') * 10 + s[i - 1] - '0' < 27) dp[i] += dp[i - 2]; } return dp[l]; } };
【Over】
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
· 零经验选手,Compose 一天开发一款小游戏!