Leetcode 91. Decode Ways

原題地址

https://leetcode.com/problems/decode-ways/description/

題意

將A-Z用數(shù)字表示

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

給定一串?dāng)?shù)字組成的string,求出有幾種不同的翻譯方式。

思路

dp[i] 表示到第i個字符的位置有幾種不同的翻譯方式。
dp[i+1]時則只需要考慮 string[i+1]是否能與string[i]結(jié)合,然后分別在dp[i]的基礎(chǔ)上加上不同的值。

然而還是太naive,忘記考慮 ‘0’ 的存在了。本題‘0’只能跟在其他數(shù)字之后,而不能組成‘0X’這樣的形式。
打碼的時候基于‘0’的很多情況都沒考慮到,都是碰到測試樣例不過看樣例才發(fā)覺哪里錯了,然后修修補(bǔ)補(bǔ),因此代碼寫得比較不忍卒讀。
有空的時候會重新寫一遍的。

代碼

#include <iostream>
#include <string>
#include <stdlib.h>     /* atoi */

using namespace std;

class Solution {
public:
    int numDecodings(string s) {
        if (s.size() == 0) return 0;
        if (s.size() == 1) {
            if (s[0] == '0') return 0;
            else return 1;
        }
        if (s.size() == 2 ) {
            if (s[0] == '0') return 0;
            if(s[1]=='0'){
                if ( atoi(s.c_str()) <= 26) {
                    return 1;
                } else {
                    return 0;
                }                   
            }else{
                if ( atoi(s.c_str()) <= 26) {
                    return 2;
                } else {
                    return 1;
                }   
            }
        }
        int n = s.size();
        int dp[n + 1];
        for (int i = 0; i < n; i++) {
            if (s[0] == '0') return 0;
            if (s[i] == '0' && (atoi(s.substr(i - 1, 2).c_str()) > 26 || atoi(s.substr(i - 1, 2).c_str()) == 0)) return 0;
        }
        dp[1] = 1;
        if (s[1] == '0') {
            dp[2] = 1;
            cout << "a" << endl;
        } else if (atoi(s.substr(0, 2).c_str()) <= 26) {
            dp[2] = 2;
        } else {
            dp[2] = 1;
        }
        for (int i = 2; i < n ; i++) {
            if ( s[i] == '0') {
                if (atoi(s.substr(i - 1, 2).c_str()) > 20) {
                    // cout<<s.substr(i - 1, 2)<<endl;
                    return 0;
                } else {
                    dp[i+1] = dp[i - 1];
                }
            } else if(s[i-1]=='0'){
                dp[i+1]=dp[i-1];
            } else if ( atoi(s.substr(i - 1, 2).c_str()) <= 26) {
                dp[i+1] = dp[i ] +dp[i-1];
            } else {
                dp[i+1] = dp[i ];
            }
        }
        for(int i =1;i<=n;i++){
            cout<<dp[i]<<endl;
        }
        return dp[n];
    }
};

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容