栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

leetcode91

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

leetcode91

解码方法:https://leetcode.cn/problems/decode-ways/submissions/

思路:题目中要求求出数字到字母的映射,需要注意前导零的处理,像这种全局最优依赖于局部最优的问题就需要使用动态规划来求解了。

首先对字符串进行遍历,每次都需要考虑前一位的数字,用a代表当前位置的数字,用b代表前一位与当前位置组成的数字,如果b能组成满足题目的数字的话(也就是b>=10&&b<=26),那么就代表有更多的映射方法,也就是当前位置就可以由 第i-1位数字和第i-2位数字共同组成。否则当前位置的方法数和前一位的方法数一样。

根据题目的意思可以列出以下的公式:

F[i] = F[i-1] ,  a>=1&& a <=9 

F[i] += F[i-2], b>=10&& b<=26

func numDecodings(s string) int {
    n:= len(s)
    if s[0] == '0'{
        return 0
    }
   
    dp := make([]int,n+1)
    dp[0] = 1
    for i:= 1; i< n; i++ {
        num1 := (s[i-1] - '0') * 10 + s[i] -'0'
        num2 := s[i] - '0'
        if num2 >=1 && num2 <=9 {
            dp[i] = dp[i-1]
        }
        if num1 <=26 && num1 >=10 && i >=2{
            dp[i] += dp[i-2]
        } else if num1 <=26 && num1 >=10 && i ==1{
            dp[i]+=1
        }
        
    
    }
    return dp[n-1]
}

放张图激励下自己:

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/949849.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号