第十四周

91. Decode Ways

A message containing letters from A-Z is being encoded to numbers using the following mapping:

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

Given an encoded message containing digits, determine the total number of ways to decode it.

用數字1~26表示字母“A”~“Z”。給出一串數字,返回所有可能解碼的總數。
注意:1.若兩位數超過26或以0開頭則不能被解碼。
2.若出現兩位或以上0則可解碼數爲0。

一開始打算用遞歸方法,但發現不可行,輸入的字符串應被當作整體解碼。用動態規劃遍歷字符串。
條件一:單字符滿足在1~9範圍內。
條件二:雙字符滿足10~26範圍內。
從第二個字符開始遍歷字符串,檢查當前字符與前一個字符,若滿足條件之一,結果加一,若發現兩條件都不滿足,直接返回0。

int numDecodings(string s) {
    int size = s.size();
    if(size == 0 || s[0] == '0') 
        return 0;
    else if(size== 1) 
        return 1;
    else
    {
        int res = 0,num1 = 1,num2 = 1;
        for(int i = 1;i < size;i++)
        {
            int temp = num1;
            if(isValid(s[i]))
            {
                if(isValid(s[i-1],s[i])
                    res+=num1+num2;
                else if(!isValid(s[i-1],s[i]))
                    res+=num1;
            }  
            if(!isValid(s[i]))
            {
                if(isValid(s[i-1],s[i]))
                    res+=num2;
                else if(!isValid(s[i-1],s[i]))
                    return 0;
            } 

            num1 = res;
            num2 = temp;
            res = 0;
         }
            return num1;
        }
    }
    bool isValid(char a,char b){
        return a == '1'||(a == '2' && b <='6');
    }
    bool isValid(char a){
        return a != '0';
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章