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

解码方法(c++)

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

解码方法(c++)

91. 解码方法

难度中等1113收藏分享切换为英文接收动态反馈

一条包含字母 A-Z 的消息通过以下映射进行了 编码 :

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

要 解码 已编码的消息,所有数字必须基于上述映射的方法,反向映射回字母(可能有多种方法)。例如,"11106" 可以映射为:

"AAJF" ,将消息分组为 (1 1 10 6)"KJF" ,将消息分组为 (11 10 6)

注意,消息不能分组为  (1 11 06) ,因为 "06" 不能映射为 "F" ,这是由于 "6" 和 "06" 在映射中并不等价。

给你一个只含数字的 非空 字符串 s ,请计算并返回 解码 方法的 总数 。

题目数据保证答案肯定是一个 32 位 的整数。

实例

输入:s = "12"
输出:2
解释:它可以解码为 "AB"(1 2)或者 "L"(12)
解题思路

f[i][0]:s[i]单独对应一个数字时,前i个字符可以组合成符号要求的数字的组合数

f[i][1]:s[i-1]和s[i]组合成两位的数字时,前i个字符可以组合成符号要求的数字的组合数

1.初始条件

 f[0][0]=1;

 f[0][1]=0;

2.边界情况

s[i]=='0'时,一定是两位数字的末尾——令f[i][0]=0;

s[i-1...i]转换后的数值超过26时,s[i-1]和s[i]不能组合成符合要求二位数字——令f[i][1]=0;

3.状态转移方程

f[i][0]=f[i-1][0]+f[i-1][1];

f[i][1]=f[i-1][0];

4.计算顺序

f[1][0],f[1][1]

f[2][0],f[2][1]

......

 f[n-1][0],f[n-1][1]

5.结果

f[n-1][0]+f[n-1][1]

class Solution {
public:
    //字符转整数
    int Num(char ch){
        return (ch-'1'+1);
    } 

    int numDecodings(string s) {
        int n=s.length();
        
        vector > f(n,vector(2,0));
        if(s[0]=='0') return 0;
        //初始条件
        f[0][0]=1;f[0][1]=0;
        
        for(int i=1;i=3||((Num(s[i-1])==2)&&(Num(s[i])>=7))){
                f[i][1]=0;
            }else{
                f[i][1]=f[i-1][0];
            }
        }
        return f[n-1][0]+f[n-1][1];
    }
};

测试结果

 

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

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

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