C++实现字符串(用数字加密过)可能的解密结果的数量
一条包含 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 }