力扣 面試題46. 把數字翻譯成字符串 dp

https://leetcode-cn.com/problems/ba-shu-zi-fan-yi-cheng-zi-fu-chuan-lcof/
在這裏插入圖片描述

思路:爲了方便,我們把輸入轉換成一個字符串,並且下標從11開始,用dp[i]dp[i]表示s[1i]s[1…i]對應的數字有多少種不同的翻譯方法。顯然單個數字一定可以對應一種翻譯方法,所以有dp[i]+=dp[i1]dp[i]+=dp[i-1],如果是兩個數字的話,我們需要計算然後判斷它和2525的關係(注意特判掉前導00的情況),如果也能對應一種翻譯方法的話,就有dp[i]+=dp[i2]dp[i]+=dp[i-2]。注意初始化要使得dp[0]=dp[1]=1dp[0]=dp[1]=1

class Solution {
public:
    int getval(int i,string &s)
    {
        if(s[i-1]=='0')//不合題意
            return 30;
        return (s[i-1]-'0')*10+s[i]-'0';
    }
    int translateNum(int num) {
        stringstream ss;
        ss<<" "<<num;
        string s=ss.str();
        vector<int> dp(s.size());
        int len=s.size()-1;
        dp[0]=dp[1]=1;//一個數字一定可以翻譯成一個字符
        for(int i=2;i<=len;i++)
        {
            dp[i]+=dp[i-1];//s[i]一個數字一定可以翻譯成一個字符
            if(getval(i,s)<=25)//s[i-1]和s[i]可以翻譯成一個字符
                dp[i]+=dp[i-2];
        }
        return dp[len];
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章