pythonabc对应123,一道笔试题: 输入一串数字,求对应英文字母出现的可能性 z = {'a':1, 'b':2, .... , 'z':26}, 输入: 123,输出: abc, lc, a...

12

2019-11-12 09:04:47 +08:00   b7048e5c0150a989fed46971f5ac1886.png 3

这道题,可以从记忆化递归的角度来理解,比如对于一个字符串 F("2213")=5, 可以分解为 F("213")和 F("13")两个子问题,在 F("213")这个子问题中又可以分为 F("13")和 F("3")两个子子问题,F("13")这个子子问题和 F("13")子问题是重复的,因而可以考虑使用记忆化搜索或动态规划来解决这个问题。

特别地,如果一个数中的一个前缀和两个前缀都是合法的,那么这个值等于斐波那契数列+1(此时解空间实际上就等价于斐波那契数列的状态转移方式),例如,f("12121212")=Fibonacci number(8+1) = 34

```cpp

class Solution {

public:

int numDecodings(string s) {

if(s.length() == 0) return 0;

unordered_map ways;

ways[""] = 1;

function dfs = [&](const string& s){

if(ways.count(s)) return ways[s];

if(s[0] == '0') return 0; // 第一位是 0,这是非法的返回 0

if(s.length() == 1) return 1; // e.g. 1-9,返回一种方式

int w = dfs(s.substr(1)); // 把第一位去掉,子问题 1

int prefix = stoi(s.substr(0,2)); // 取前两位,子问题 2

if(prefix <= 26) w += dfs(s.substr(2)); // 检查是否合法

ways[s] = w;

return w;

};

return dfs(s);

}

};

```

执行用时 :8 ms, 在所有 cpp 提交中击败了 37.55%的用户

内存消耗 :16.5 MB, 在所有 cpp 提交中击败了 5.18%的用户

记忆化搜索比较好理解,此外我的思考难免存在不足,欢迎批评指教

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值