算法作业系列11——Decode Ways

来源:互联网 发布:iphone无缝拼图软件 编辑:程序博客网 时间:2024/06/05 18:26

算法作业系列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;    }};