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

leetcode每日一题36

91.解码方法

变形的蜗牛爬塔问题,动态规划
五部曲走起

  1. 确定dp数组及下标含义
    f(n)代表当前在字符串的第n位时的解码方法数,而因为可以一次性分割(解码)1位或两位,那么在n位时,假设其上一位为a,当前位为b,前面为xxx
    xxxab,那么就可以分割为xxxa b和xxx ab
    所以当前位的分割数相当于xxxa的分割数与xxx的分割数之和
    方法数就是f(n-1)和f(n-2)的之和
    同时,f(0)代表着空串的分割次数,所以f和字符串s的序号间应该差一位
  2. 确定递推公式
    f(n)=f(n-1)+f(n-2)
    但有几种特殊情况
    第0位不能为0
    如果s(n-1)==0,也就是当前位=0,0不能被单独解码,所以不存在单独的在n位前的分割,
    如果前一位为0,那么不可解码,返回0
    如果前一位不为0,但是>2的数,如3,那么和前一位合起来就是30,也不能解码,返回0
    如果前一位>0&&❤️,那么可以和前一位合起来解码
    因此此时的解码方法数与xxx时相同,解码为xxx ab
    则f(n)=f(n-2)
    如果s(n-1)*10+s(n)>26,那么就不能分隔为xxx ab,只能分割为xxxa b
    则f(n)=f(n-1)
    这里主要是f和s总是差一位,所以有点绕
for(int i=2;i<s.length()+1;i++)
{
    if(s[i-1]=='0'&&s[i-2]>'0'&&s[i-2]<'3')
        f[i]=f[i-2];
    else if(s[i-1]=='0'&&(s[i-2]=='0'||s[i-2]>'2'))
        return 0;
    else if(s[i-2]=='1'||(s[i-2]=='2'&&s[i-1]<'7'))
        f[i]=f[i-1]+f[i-2];
    else f[i]=f[i-1];
}
  1. 初始化
    f(0)=1;
    f(1)=1;
  2. 确定遍历顺序
    从前往后
  3. 举例推导

完整代码:

class Solution {
public:
    int numDecodings(string s) {
        vector<int> f(s.length()+1,0);
        if(s[0]=='0')
            return 0;
        f[0]=1;
        if(s.length()==1)
            return 1;
        f[1]=1;
        for(int i=2;i<s.length()+1;i++)
        {
            if(s[i-1]=='0'&&s[i-2]>'0'&&s[i-2]<'3')
                f[i]=f[i-2];
            else if(s[i-1]=='0'&&(s[i-2]=='0'||s[i-2]>'2'))
                return 0;
            else if(s[i-2]=='1'||(s[i-2]=='2'&&s[i-1]<'7'))
                f[i]=f[i-1]+f[i-2];
            else f[i]=f[i-1];
        }
        return f[s.length()];
    }
};

主要在f和s对齐的事情上纠结了很久,最后好不容易画图想明白了
下次这种事情还是得画一画
本来想能不能让f和s的序号一致的,后来发现还是不行,绕不出来
官解下面有位大佬给了思路:

当前位若不为 0,一定可以独立编码,所以 dp[i] = dp[i - 1],然后再去考虑能不能后两位联合编码,后两位联合编码要满足两个条件:1.前一位不为字符 ‘0’; 2.这两位构成的数小于等于 26 。如果这两个条件都满足,就在原来的基础加上联合编码的种类 dp[i] += dp[i - 2],等等!还要考虑越界的问题,也就是 i = 1 时怎么办 ?很简单,就是在前面的基础上加一,这个一指的就是后两位联合编码

粘一下他的代码:

public:
    int numDecodings(string s) {
        int n = s.size();
        if (s[0] == '0') {
            return 0;
        }
        vector<int> dp(n);
        dp[0] = 1;
        for (int i = 1; i < n; ++i) {
            if (s[i] != '0') {
                dp[i] = dp[i - 1];
            }
            if (s[i - 1] != '0' && (s[i - 1] - '0') * 10 + s[i] - '0' <= 26) {
                if (i > 1) {
                    dp[i] += dp[i - 2];
                }
                else {
                    dp[i] += 1;
                }
            }
        }
        return dp[n - 1];
    }
};

哎,怎么到这个时候了还是这么菜

相关文章:

  • 聊聊 Jetpack Compose 的 “状态订阅自动刷新” -- mutableStateListOf
  • OpenCV Mat和Bitmap的转换
  • Linux篇之基于Centos的everything镜像搭建yum镜像源
  • SSM项目实战-mapper实现
  • 【halcon】halcon 函数文件 以及 脚本引擎如何调用外部函数文件 下篇
  • 基于SSM的图书馆管理系统的设计与实现
  • 目标检测YOLO实战应用案例100讲-基于深度学习的输电线路 鸟巢检测
  • 阿里云虚拟机安装nginx容器步骤
  • 互联网Java工程师面试题·Spring Boot篇·第一弹
  • uniapp开发小程序经验记录
  • python监控cpu程序
  • dockerfile与docker-compose解释及对比
  • C++12.4
  • mysql主从复制-redis集群扩容缩容、缓存优化(缓存更新策略、穿透,击穿,雪崩)、mysql主从搭建、django实现读写分离
  • 「Qt Widget中文示例指南」如何创建一个计算器?(二)
  • [ROS2] --- ROS diff ROS2
  • Python 3 使用 write()、writelines() 函数写入文件
  • SQL Server对象类型(8)——4.8.约束(Constraint)
  • 个人硬件测试用例入门设计
  • 跟我学c++高级篇——动态反射之二动态列表
  • 《克莱默夫妇》导演罗伯特·本顿去世,终年92岁
  • 上海首发经济“卷”到会展业,浦东签约三个年度“首展”
  • 习近平出席中国-拉美和加勒比国家共同体论坛第四届部长级会议开幕式并发表重要讲话
  • 再获殊荣!IP SH跻身上海文化品牌全球传播力TOP 6
  • 何谓“战略稳定”:“长和平”的实现基础与机制
  • 湖南湘西州副州长刘冬生主动交代问题,接受审查调查