算法作业系列11——Decode Ways

算法作业系列11

Decode Ways

写在前面

如果你是来找答案的,下面先提供你一下思路,拿回去自己再想想看是不是真的不会。
1. 从第二个开始,考虑当前位置有多少种组合时候,想想看,如果能和前一个位置组成合法的组合的话,那就是上一个位置的组合方式加上上上个位置的组合方式;如果不能,只能乖乖等于上个位置的组合方式
2. 根据第一条写出来基础代码后 ,提交看看,自己是不是忘了特殊的0?

题目

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

'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).

The number of ways decoding “12” is 2.

思路

这题其实并不是那么难,所以我这里只是简单说一下思路,基础的思路上面已经给出了,这里只是补充说明以及写下一些特殊情况。
1. 对于某个位置来说,我们看从0-i(当前位置的下标)有多少种时,先看从0-(i-1)有多少种,这是一种组合情况;接下来再看从0-(i-2)有多少种,如果当前位置和上一个位置组成的数字是合法的,那么我们就多了一种组合方式,那就是这两个组合在一起,前面到i-2的数目加上前面i-1的数目就是要的数目。
2. 现在考虑0,题目并不把0看作合法的,也就说01并不代表1,所以对于每一个0,我们要想,首先,它自身一定是不能单独代表某个数字的;其次,如果它和前面的组合得到的结果同样不合法,那这个字符串就无法拆分成合法的,因此,0的判别非常重要

代码

#include<iostream>
#include<string>
using namespace std;

class Solution {
public:
    int numDecodings(string s) {
        if (s.length() == 0 || s[0] == '0') {
            return 0;
        }
        int a = 1;
        int b = 1;
        for (int i = 1; i < s.length(); i++) {
            if (s[i] == '0' && (s[i - 1] == '0' || s[i - 1] > '2')) {
                return 0;
            }
            if (s[i] == '0') {
                int c = a;
                a = b;
                b = c;
                continue;
            }
            string tmp = s.substr(i - 1, 2);
            int num = stoi(tmp, nullptr);
            if (num >= 10 && num <= 26) {
                int c = b;
                b = a + b;
                a = c;
            } else {
                a = b;
            }
        }
        return b;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值