字符串解码

原题在这里

  概述题意:给定数字字符串,要求可以转换为对应字母字符串的种数。

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

本来写了一个dfs暴力,果然还是TLE了

code:

 

复制代码
class Solution
{
    int l, ans;
    string x;
    void dfs(int i)
    {
        if (i > l || (i < l && x[i] == '0'))
            return;
        if (i >= l - 1)
        {
            ans++;
            return;
        }
        dfs(i + 1);
        if (i + 1 < l && ((x[i] - '0') * 10 + x[i + 1] - '0') < 27)
            dfs(i + 2);
    }

public:
    int numDecodings(string s)
    {
        x = s, l = s.length();
        dfs(0);
        return ans;
    }
};
dfs
复制代码

 

标准写法还得是动态规划:

  定义dp[i]表示[0,i]长度的数字字符串能构成的字母字符串种数

  初始化有dp[0]=1

  转移方程分析:

    因为'0'不能单独构成,所以

      dp[i]=dp[i-1],s[i]!='0'

    有二位数构成的字母,所以

      dp[i]+=dp[i-2],(s[i-1]-'0')*10+s[i]-'0'<27 and s[i-1]!='0'

    写完了,最后优化一下边界处理,将初始遍历下标改为1

所以最终code:

 

复制代码
class Solution
{
public:
    int numDecodings(string s)
    {
        int l = s.length();
        vector<int> dp(l + 1, 0);
        dp[0] = 1;
        for (int i = 1; i <= l; ++i)
        {
            if (s[i - 1] != '0')
                dp[i] += dp[i - 1];
            if (i > 1 && s[i - 2] != '0' && (s[i - 2] - '0') * 10 + s[i - 1] - '0' < 27)
                dp[i] += dp[i - 2];
        }
        return dp[l];
    }
};
复制代码

 

【Over】

 

posted @   Renhr  阅读(36)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
· 零经验选手,Compose 一天开发一款小游戏!
点击右上角即可分享
微信分享提示