【Leetcode】【Medium】Decode Ways

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

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

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

For example,
Given encoded message "12", it could be decoded as "AB" (1 2) or "L" (12).app

The number of ways decoding "12" is 2.spa

 

解题思路:code

使用动态规划的思想。blog

(一)字符串

初始想法能够创建一个数组,数组的每一位保存对应字符串的每一位可能出现的解码方式,例如:string

字符串321321312;其对应的截止到每一位可能存在的解码方式种类为:it

3 - 1种class

32 - 1种

321 - 2种

3213 - 3种

32132 - 5种

....

因此获得解码方式数组为:

原字符串S:    3  2  1  3  2  1  3  1  2

解码种类数组A:  1  1  2  3  5  8 16 16 32

发现:

(1)若是当前字符能够和上一个字符组成二元字符,例如'1'和'2'组成'12',那么A[i] = A[i-1] + A[i-2];

  很好理解,等于将'1' '2'分开的解码种类与将'12'合起来的解码种类之和;

(2)若是当前字符不能和上一个字符组成二元字符,那么A[i] = A[i-1];

 

(二)

所以,进一步的思路是,不须要创建一个数组,只须要保存i-2和i-1的解码种类数就能够了,分别用r1和r2表示;

若是当前字符能够组成二元字符,那么当前字符的次数 = r1 + r2;

若是不能,当前字符次数 = r1;

 

(三)

进一步发现,只用r1和r2两个变量就够了

(1)每次遇到能够组成二元字符的字符时,就更新r1,使r2等于旧的r1:

  r1= r1 + r2;

  r2 = r1;

(2)当不能组成二元字符时,r1不变,更新r2为r1;

(3)最终返回r1;

 

注意:

若是当前字符是'0',若是将'0'单独算,则不能产生任何解码数,即解码数为0;

 

代码:

 1 int numDecodings(string s) {
 2     if (!s.size() || s.front() == '0') return 0;
 3     int r1 = 1, r2 = 1;
 4 
 5     for (int i = 1; i < s.size(); i++) {
 6         if (s[i] == '0') r1 = 0;
 7 
 8         if (s[i - 1] == '1' || s[i - 1] == '2' && s[i] <= '6') {
 9             r1 = r2 + r1;
10             r2 = r1 - r2;
11         } else {
12             r2 = r1;
13         }
14     }
15 
16     return r1;
17 }
相关文章
相关标签/搜索