Leetcode-91. 解碼方法

題目鏈接

誰能想到測試樣例還有000這種非法輸入,哭了。
!!邊界測試的重要性,真的是測到崩潰QAQ。

思路

dp[i]:表示前i個元素能組成的解碼方法.
s[i]==0:自己不合法,必須要和前面1或2的拼,因此倒數兩位固定。
s[i-1]=='1'||(s[i-1]=='2'&&s[i]>'0'&&s[i]<='6'):自己這位合法,自己和前一位組合也合法,考慮兩種情況dp[i-1],dp[i-2]的和
else:自己合法,無法和前一位組合。

class Solution {
public:
    int numDecodings(string s) {
        if(s[0]=='0') return 0;
        vector<int> dp(s.length()+1,0);
        dp[0]=dp[1]=1;
        for(int i=1;i<s.length();i++)
        {
            if(s[i]=='0')
            {
                if(s[i-1]=='1'||s[i-1]=='2')
                    dp[i+1]=dp[i-1];
                else
                    return 0;
            }
            else{
                if(s[i-1]=='1'||(s[i-1]=='2'&&s[i]>'0'&&s[i]<='6'))
                {
                    dp[i+1]=dp[i-1]+dp[i];
                }
                else
                {
                    dp[i+1]=dp[i];
                }
            }
        }
        return dp[s.length()];
    }
};

由於只需要兩個數,可以降到O(1)空間

class Solution {
public:
    int numDecodings(string s) {
        if(s[0]=='0') return 0;
        vector<int> dp(s.length()+1,0);
        int pre=1;//i-2
        int cur=1;//i-1
        for(int i=1;i<s.length();i++)
        {
            int tmp=cur;//i-1
            if(s[i]=='0')
            {
                if(s[i-1]=='1'||s[i-1]=='2')
                    cur=pre;//i=i-2
                else
                    return 0;
            }
            else{
                if(s[i-1]=='1'||(s[i-1]=='2'&&s[i]>'0'&&s[i]<='6'))
                {
                    cur=cur+pre;//i=i-1+i-2
                }
            }
            pre=tmp;//i-2=i-1
        }
        return cur;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章