Leetcode 数字序列翻译

这篇博客探讨了LeetCode中一个关于数字到字母序列的解码问题。通过分析给定数字串,确定哪些数字能独立翻译为字母,哪些必须与前一个数字组合。特别地,遇到数字0时,它只能与1或2组成10或20。博客提到了常见的错误情况,如连续的0无法解码,并提出了使用深度优先搜索(DFS)来统计所有可能的解码方式。在DFS过程中,会根据can[]数组判断当前数字是否可以单独或组合解码,并递归进行下一步操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

有一种将字母编码成数字的方式:'a'->1, 'b->2', ... , 'z->26'。

现在给一串数字,返回有多少种可能的译码结果

示例1

输入

复制

"12"

输出

复制

2

说明

2种可能的译码结果(”ab” 或”l”)

 

思路:

对于一个字符,分析其能否单独翻译成一个单词,以及能否组合翻译成一个单词

特别的:  对于含有0的数字,其只能够与前面的1或2组合成 “10” 或 “20”

易错点:对于多个连续0 将无法翻译   对于   “210”   其只能翻译成 “2” “10”

 

基本做法:

设置bool  can[]数组  标记出只能组合的数字为false   即  遇到0时,判断前面是否为1 或 2   

将这连续的两个位置标记为    can[i-1]=false    can[i]=false

 

采用dfs 统计总数,

①对于num[i]  若其为can[i]=true  那么可以单独翻译=》dfs(depth+1)  

     进一步分析其能否与后面一个组合翻译(i+1<n 并且 can[i+1]==true 并且位于 10至26之间 )  =》 dfs(depth+2)

②对于num[i] 其can[i]=false  说明只能组合翻译(“10” “20

引用中的代码片段是一个递归函数,名为beautifulArray,它接受一个整数n作为参数,并返回一个vector<int>类型的结果。这个函数用于生一个长度为n的漂亮数组,漂亮数组满足以下条件:如果将其划分为两个任意长度的子数组,那么两个子数组的元素之和不相等。 函数的实现思路是通过递归,将问题划分为两个子问题,然后合并子问题的解。首先判断n是否等于1,如果等于1,则直接返回一个包含1的数组。否则,将n减1后的一半传入递归函数beautifulArray,得到一个漂亮数组res1。然后将n的一半传入递归函数beautifulArray,得到另一个漂亮数组res2。最后,将res1中的每个元素乘以2并减去1,然后与res2中的每个元素乘以2合并到结果数组res中。 引用中的代码片段是一个函数,名为translateNum,它接受一个整数num作为参数,并返回一个整数。这个函数用于计算将整数num翻译字符串的不同方法数。 函数的实现思路是将整数num转换为字符串str,然后创建一个长度为str.size()-1的动态数组dp,用于记录不同位置的翻译方法数。然后初始化dp和dp[1]为1,表示前两位数字翻译方法数。接下来,从第三位数字开始遍历字符串str,如果当前数字与前两位数字可以构一个在10到25之间的整数,则将dp[i]的值设置为dp[i-1]+dp[i-2],表示当前位置的翻译方法数为前一位和前两位数字翻译方法数之和。最后,返回dp最后一个元素的值,即为翻译整数num的不同方法数。 引用中的代码片段是一个函数,名为numberOfArithmeticSlices,它接受一个vector<int>类型的数组nums作为参数,并返回一个整数。这个函数用于计算数组nums中等差子序列的个数。 函数的实现思路是通过动态规划,创建一个与nums长度相同的动态数组dp,用于记录以每个位置为结尾的等差子序列的个数。然后遍历数组nums,从第三个元素开始,判断当前元素与前两个元素是否构等差数列,如果是,则将dp[i]的值设置为dp[i-1]加1,表示以当前位置为结尾的等差子序列个数为前一位的等差子序列个数加1。最后,返回dp数组中所有元素的和,即为等差子序列的个数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值