leetcode面試題46. 把數字翻譯成字符串/典型的青蛙跳臺階題目(遞歸),動態規劃

文章目錄

題目

給定一個數字,我們按照如下規則把它翻譯爲字符串:0 翻譯成 “a” ,1 翻譯成 “b”,……,11 翻譯成 “l”,……,25 翻譯成 “z”。一個數字可能有多個翻譯。請編程實現一個函數,用來計算一個數字有多少種不同的翻譯方法。

示例 1:

輸入: 12258
輸出: 5
解釋: 122585種不同的翻譯,分別是"bccfi", "bwfi", "bczi", "mcfi""mzi"

提示:

0 <= num < 2^31

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/ba-shu-zi-fan-yi-cheng-zi-fu-chuan-lcof
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。

基本思想

看了評論才發現這是個青蛙跳臺階的題目,只不過在跳兩階臺階時有些限制
青蛙跳臺階,遞歸

class Solution {
public:
    int translateNum(int num) {
        string str = to_string(num);
        return fun(str);
    }
    int fun(string str){
        if(str.length() < 2)
            return 1;
        else if(str.length() == 2){
            int n = atoi(str.c_str());
            if(n >= 10 && n < 26)
                return 2;
            else
                return 1;
        }
        else{
            int front = atoi(str.substr(0, 2).c_str());
            if(front >= 10 && front < 26)
                return fun(str.substr(1, str.length() - 1)) + fun(str.substr(2, str.length() - 2));
            else 
                return fun(str.substr(1, str.length() - 1));
        }
    }
};

動態規劃

  • dp[i]:以當前字符結束有多少種翻譯方法
  • 狀態:字符
  • 選擇:當前字符和前面一個字符能否合併
  • 轉移方程:能合併dp[i] = dp[i - 1] + dp[i - 2];不能合併dp[i] = dp[i - 1]
class Solution {
public:
    int translateNum(int num) {
        string str = to_string(num);
        return fun(str);
    }
    int fun(string str){
        //動態規劃
        vector<int> dp(str.length() + 1);
        dp[0] = 1;
        dp[1] = 1;
        for(int i = 2; i <= str.length(); ++i){
            int cur = (str[i - 2] - '0') * 10 + str[i - 1] - '0';
            dp[i] = dp[i - 1];
            if(cur > 9 && cur < 26)
                dp[i] += dp[i - 2];
            //cout << dp[i] << endl;
        }
        return dp[str.length()];
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章