A message containing letters from A-Z
is being encoded to numbers using the following mapping:
'A' -> 1 'B' -> 2 ... 'Z' -> 26
Given a non-empty string containing only digits, determine the total number of ways to decode it.
Example 1:
Input: "12" Output: 2 Explanation: It could be decoded as "AB" (1 2) or "L" (12).
Example 2:
Input: "226" Output: 3 Explanation: It could be decoded as "BZ" (2 26), "VF" (22 6), or "BBF" (2 2 6).
该题将大写英文字母和1~26一一对应,给出一串数字要求求出数字对应的可能的字母组合种类数。
这是一个动态规划问题。当前的组合数和之前的组合数相关。
字母至少占据一个数字,最多占据两个数字,给出如下分类情况:
对字符串中的字符两两分组依次求出当前为止的组合种类数。只要出现组合种类数为0的情况就直接返回0,因为这说明该字符串无法全部转换成字母形式。
求当前组合数:
这三种组合数计算方法依次对应分情况讨论中的后三种情况。
由此可以得到代码如下:
class Solution { public: int numDecodings(string s) { if(s.empty() || s[0]=='0')return 0; vector<int> dp(s.size(),0); dp[0]=1; if(s.size()==1)return dp[0]; if(s[1]=='0'){ if(!isValid(s[0],s[1]))return 0; dp[1]=1; } else{ if(isValid(s[0],s[1]))dp[1]=2; else dp[1]=1; } if(s.size()==2)return dp[1]; for(int i=2;i<s.size();++i){ if(s[i]=='0'){ if(!isValid(s[i-1],s[i]))return 0; dp[i]=dp[i-2]; } else{ if(isValid(s[i-1],s[i]))dp[i]=dp[i-1]+dp[i-2]; else dp[i]=dp[i-1]; } } return dp[s.size()-1]; } bool isValid(char first,char second){ return first=='1' || (first=='2' && second<='6'); } };