字符串解码

原题在这里

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

      '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 @ 2022-03-27 11:27  Renhr  阅读(43)  评论(0)    收藏  举报