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';
}