C++实现字符串(用数字加密过)可能的解密结果的数量

发布时间 2023-07-21 00:00:28作者: 一只小瓶子

一条包含 A-Z 字母的信息,用如下的数字加密方法进行加密

'A' -> 1

'B' -> 2

...

'Z' -> 26

给定一个已经用上述加密方法进行加密的非空字符串, 请返回可能的解密结果的数量。

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个字符, 剩下的字符串>和<2个字符, 剩下的字符串>两种方式。

    递归拆分剩下的字符串,直至无法再拆分也没有遇到非法解密或非法字符的情况,则视为该解密方法可行,计数+1。

    有点类似于二叉树的深度遍历,查找统计每条最后拆分出来剩下的字符为1个或两个合法字符的路线。

 1 //递归遍历可能的解密结果
 2 int numDecodings(string s)
 3 {
 4     //合法字符[1,9];检测非法字符,0不可以在第一位,否则也为非法字符
 5     if (s.size() > 0 && (s[0] <= '0' || s[0] > '9'))
 6         return 0;
 7 
 8     if (s.size() <= 1)//无法再拆分,成功解密+1
 9         return 1;
10 
11     int dst_num = 0;
12     
13     //1. 将字符串拆分成1个字符和剩下的所有字符两部分
14     string s1 = s.substr(0, 1);
15     dst_num += numDecodings(s.substr(1, s.size()));//继续拆分剩下的部分
16 
17     //2. 将字符串拆分成2个字符和剩下的所有字符两部分
18     string s2 = s.substr(0, 2);
19     if (s2 > "26")//非法解密,中断该条解密路线
20     {
21         return dst_num;//返回1. 解密的结果
22     }
23     else//合法解密
24     {
25         dst_num += numDecodings(s.substr(2, s.size()));//继续拆分剩下的部分
26     }
27 
28     return dst_num;
29 }