LeetCode刷题--点滴记录020

Posted 鲁棒最小二乘支持向量机

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode刷题--点滴记录020相关的知识,希望对你有一定的参考价值。

20. 剑指 Offer 46. 把数字翻译成字符串

要求

给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。

思路

动态规划:

  • 状态定义: 设动态规划列表 dp ,dp[i] 代表以 xi为结尾的数字的翻译方案数量
  • 转移方程: 若 xi和 x i−1组成的两位数字可被整体翻译,则 dp[i] = dp[i - 1] + dp[i - 2] ,否则 dp[i] = dp[i - 1] 。可被整体翻译的两位数区间是[10,25]
  • 初始状态: dp[0] = dp[1] = 1 ,即 “无数字” 和 “第 1 位数字” 的翻译方法数量均为1。当 num 第 1, 2 位的组成的数字∈[10,25] 时,显然应有 2种翻译方法,即 dp[2] = dp[1] + dp[0] = 2 ,而显然 dp[1]=1 ,因此推出 dp[0]=1
  • 返回值: dp[n],即此数字的翻译方案数量

解题

#include <iostream>
using namespace std;
#include <vector>
#include <string>

class Solution 
public:

    int translateNum(int num) 
        string s = to_string(num);
        vector<int> dp(s.size()+1, 0);        // dp[0] 是空串
        dp[0] = dp[1] = 1;              // dp[1]是长度为1的字符串
        for (int i = 2; i < s.size()+1; i++) 
            string tmp = s.substr(i - 2, 2);  //字符串切片
            if (tmp.compare("10") >= 0 && tmp.compare("25") <= 0)
                dp[i] = dp[i - 1] + dp[i - 2];
            else dp[i] = dp[i - 1];
        
        return dp[s.size()];
    
;

void test01()

    Solution solution;
    int num = 12258;
    cout << solution.translateNum(num) << endl;


int main()

    test01();

    system("pause");
    return 0;

希望本文对大家有帮助,上文若有不妥之处,欢迎指正

分享决定高度,学习拉开差距

以上是关于LeetCode刷题--点滴记录020的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode刷题--点滴记录022

LeetCode刷题--点滴记录014

LeetCode刷题--点滴记录017

LeetCode刷题--点滴记录015

LeetCode刷题--点滴记录005

LeetCode刷题--点滴记录003