首页 > 其他 > 详细

解码问题--leetcode:91 (2019商汤笔试)

时间:2019-08-20 23:56:05      阅读:219      评论:0      收藏:0      [点我收藏+]

题目:有一种将字母编码成数字的方式:‘a‘->1, ‘b->2‘, ... , ‘z->26‘。

现在给一串数字,给出有多少种可能的译码结果。

 

想法:

该题就是动态规划问题,建议在写这题之前明白“背包问题”会好理解很多。

 


 

参考代码:

 1 #include<iostream>
 2 using namespace std;
 3   
 4 int numDecodings(string s)
 5 {
 6         if(!s.size() || s.front() == 0) return 0;
 7         int r1 = 1, r2 = 1;
 8         for (int i = 1; i < s.size(); i++)
 9         {
10             if (s[i] == 0) // 当当前i位为‘0’时,只有与前一位结合在一起算一个字母,即:10,20; 所以,此时r1(最大可能)不增加。
11                 r1 = 0; // 这里赋值0,是为了下一个if中r1 = r2 + r1; 将r1赋值为r2.
12             if ((s[i-1] == 1) || (s[i-1] == 2 && s[i] <= 6))
13             {
14                 r1 = r2+r1; // r1记录的是:第i位算一个字母的情况 + 第i-1位与i位合为一个字母的情况 (也就是最大的可能)
15                 r2 = r1-r2; // r2记录的是:第i-1位之前的所有可能(不包含i-1位)
16             }
17             else
18                 r2 = r1;
19         }
20         return r1;
21 }
22 int main()
23 {
24     string s;
25     while(cin >> s)
26     {
27         cout << numDecodings(s) << endl;
28     }
29     return 0;
30 }

 

解码问题--leetcode:91 (2019商汤笔试)

原文:https://www.cnblogs.com/WPF-342201/p/11385918.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!