91. Decode Ways, leetcode_yuccess的博客-程序员秘密

技术标签: 动态规划算法  leetcode  动态规划  

题目:

A message containing letters from A-Z is being encoded to numbers using the following mapping:

'A' -> 1
'B' -> 2
...
'Z' -> 26

Given an encoded message containing digits, determine the total number of ways to decode it.

For example,
Given encoded message "12", it could be decoded as "AB" (1 2) or "L" (12).

The number of ways decoding "12" is 2.

代码1,分别考虑s[i],s[j]

int numDecodings(string s) {
        int n = s.size();
        vector<int> dp(n, 0);
        if(n == 0) return 0;
        if(s[0] == '0') 
            dp[0] = 0;
        else
            dp[0] = 1;
        for(int i = 1; i < n; i++)
        {
            if(s[i - 1] - '0' > 2)
                dp[i] = s[i] == '0'? 0 : dp[i - 1];
            else if(s[i - 1] - '0' == 2)
                if(s[i] - '0' > 6)
                    dp[i] = dp[i - 1];
                else if(s[i] != '0')
                    dp[i] = dp[i - 1] + (i - 2 >= 0 ? dp[i - 2] : 1);//注意:这里要加上括号
                else
                    dp[i] = (i - 2 >= 0 ? dp[i - 2] : 1);  
            else if(s[i - 1] - '0' == 1)
                if(s[i] != '0')
                    dp[i] = dp[i - 1] + (i - 2 >= 0 ? dp[i - 2] : 1);
                else
                    dp[i] = (i - 2 >= 0 ? dp[i - 2] : 1);
            else
                if(s[i] != '0')
                    dp[i] = dp[i - 1];
                else
                    dp[i] = 0;
        }
        return dp[n - 1];
}

代码2,将最后两位合并为一个数:

int numDecodings(string s) {
        int n = s.size();
        vector<int> dp( n + 1 , 0);
        if(s[0] == '0' || n == 0)return 0;
        
        dp[0] = 1;
        dp[1] = 1;
        
        for(int i = 2; i < n + 1; i++)
        {
             int first = s[i - 1] - '0';
             int second = stoi(s.substr(i - 2, 2));
             if (1 <= first && first <= 9)
                dp[i] = dp[i - 1];
             if (10 <= second && second <= 26)
                dp[i] += dp[i - 2];
            
        }
        return dp[n];
}

代码3,代码的降维,用pre1表示dp[i-1],pre2表示dp[i-2]即可。

总结:代码2耗时6ms,代码1耗时3ms,显然代码2比1判断更少,但是1的耗时少,substr()的原因?请大神指教。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/djgjmtdmjt/article/details/52928978

智能推荐

Vant组件引入后样式不出现的解决_vant 没有样式_Daniel_Smith的博客-程序员秘密

Vant组件引入后样式不出现的解决一般是babel.config里面没有配置module.exports = { plugins: [ ['import', { libraryName: 'vant', libraryDirectory: 'es', style: (name) =&gt; `${name}/style/less`, }, 'vant'] ]}出现其他问题:3.先卸载 less-loader,重新安装:np

程序员初学者参考 ---懂得基础语法后如何做一个自己的case?_weixin_30788731的博客-程序员秘密

  对于很多人来说,我懂java语法,甚至面向对象的特性啦这些都是有了解的,但我就是不会做项目,其实项目真有那么难吗?  对于基础不牢固的人来说,我还不会这个基础点,那个还没学呢,你让我做个项目,我保证做不出来,其实,真实的项目中用到的知识点真有那么多吗?据我的经验来看,一个项目中能用到你学到的技术的百分之三十,已经是很了不起的综合项目了。所以不要有畏难情绪,走进去你就会发现,原来我已经会这么...

Jenkins安装插件失败解决办法_不羡鸳鸯丶不羡仙的博客-程序员秘密

jenkins-&gt;系统管理-&gt;管理插件-&gt;高级在下面URL中更换地址,jenkins插件源:http://mirror.esuni.jp/jenkins/updates/update-center.json也可以更换这个:清华地址https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-...

矩阵的范数_中南自动化学院“智能控制与优化决策“至渝的博客-程序员秘密

向量的范数见 向量的范数矩阵的1-范数:列元素绝对值之和最大矩阵的2-范数即:矩阵 的最大特征值开平方根矩阵的无穷范数:行绝对值之和最大还有一种是把矩阵拉伸成向量,然后再对向量求范数。在论文里面大家用的模棱两可的,具体文章还要具体来看。此处引用知乎上大佬的解答大佬: 矩阵有两种范数的定义,一种是矩阵范数,用来衡量矩阵作为变换时对向量拉扯、形变的能力,p-norm 定义为 ||A||p...

随便推点

Spring Boot项目集成阿里云短信回执_奋斗的山核桃的博客-程序员秘密

前段时间,项目中需要使用阿里云短信以及短信回执,在这里记录一下遇到的问题以及解决方案。首先,调用阿里云的短信API,返回类型是SendSmsResponse,格式如下。Code表示调用API的返回值,具体错误码参考官网[API错误码]。当Code为OK时表示调用API成功,但这并不表示接收方收到该条短信,这时候需要查看短信发送回执,也就是订阅SmsReport短信状态报告,获取短信发送状态。...

java 判断文件损坏_Java校验文件是否损坏_weixin_39731782的博客-程序员秘密

经常在程序操作文件时,遇到文件以及损坏的问题,那么如何校验文件是否损坏呢?这就需要Apache Tika包了,maven引用如下:org.apache.tikatika-parsers1.16org.apache.tikatika1.16pomorg.apache.tikatika-core1.16使用方法:try {Tika tika = new Tika();URL url = new URL...

Java实现Excel数据导入数据库_java导入excel到数据库_柚几哥哥的博客-程序员秘密

1、根据业务需求设计数据库表2、根据数据库表设计一个Excel模板模板的每列属性必须与表字段一一对应3、环境准备我这里项目环境是基于SpringBoot单体式架构,持久层用的公司框架,内置了基于MyBatis-Plus的各种单表操作的方法。导入依赖 &lt;!--使用POI读取文件--&gt; &lt;dependency&gt; &lt;groupId&gt;org.apache.poi&lt;/groupId&gt;

Python第五课---详解字典、集合、序列_ceymaomao的博客-程序员秘密

1 字典1.1 可变类型与不可变类型序列是以连续的整数为索引,与此不同的是,字典以"关键字"为索引,关键字可以是任意不可变类型,通常用字符串或数值。字典是 Python 唯一的一个 映射类型,字符串、元组、列表属于序列类型。那么如何快速判断一个数据类型 X 是不是可变类型的呢?两种方法:麻烦方法:用 id(X) 函数,对 X 进行某种操作,比较操作前后的 id,如果不一样,则 X 不可变,如果一样,则 X 可变。便捷方法:用 hash(X),只要不报错,证明 X 可被哈希,即不可变,反过来不可

Vue-cli3以上版本怎么配置Webpack_vue cli vue3 选择webpack版本_橙子微笑的博客-程序员秘密

Vue-cli3以上版本怎么配置Webpackvue-cli3以下版本中,关于webpack的一些配置都在config目录文件中,可是vue-cli3以上版本中,没有了config目录,那该怎么配置webpack呢?这时,vue-cli给我们提供了一个可选的配置文件(但需要我们自己手动创建哦vue.config.js,跟package.js同级)看下vue.config.js中常用的配置module.exports = {}publicPath:部署应用包的基本Url,默认/, 可以设置为

得到指针指向的数组的长度_指针数组长度计算_亦木95的博客-程序员秘密

1  、定义数组,要给定其长度,也可以用Type a[ ] = {……} 的方式。在对数组进行操作时,可能需要计算数组长度,方法是:sizeof(数组名)/sizeof(元素类型)  2、指针指向的字符数组长度的获取方法,不能用sizeof,因为用sizeof(指针),得到指针长度为4应该用strlen()函数。#include #include i

推荐文章

热门文章

相关标签