leetcode笔记—Decode Ways

来源:互联网 发布:lua 读取json配置文件 编辑:程序博客网 时间:2024/06/05 14:55

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.

有几种实现方式。

class Solution {public:    int numDecodings(string s) {    vector<int> ways(s.size(), 0);    if (s.size() == 0) return 0;    if (s.size() == 1) return check(s[0]);    ways[0] = check(s[0]);    ways[1] = (check(s[0]) & check(s[1])) + check(s[0], s[1]);//一位数的实现+两位数的实现        for (size_t i = 2; i < s.size(); ++i)    {              if (check(s[i])) ways[i] += ways[i - 1];//如果高位不为0,        if (check(s[i - 1], s[i])) ways[i] += ways[i - 2];//如果高两位可以是一种实现    }    return ways[s.size() - 1];    }    int check(char one)  //一位数时,不为0,则有一种方式    {        return (one != '0') ? 1 : 0;            }    int check(char one, char two)  //两位数时,如果十位数为1或者,十位数为2且个位数小于6是,则为一种方式    {        return (one == '1' || (one == '2' && two <= '6'))? 1 : 0;            }};

动态规划解法:

class Solution {  public:      int numDecodings(string s) {          // Start typing your C/C++ solution below          // DO NOT write int main() function          int len = s.size();          if(len ==0)              return 0;          int a = 1;//f(n-2)          int b = 0;//f(n-1)           // f(n)  += f(n-1)  s[n] != '0';          //  f(n)   +=  f(n-2)  s[n,n-1] eq "10"-"26";          if(s[len-1]!='0')              b = 1;          if(len==1)              return b;          int c ;          for(int i = 2; i <=len; i++)          {              string tmp = s[len-i]+s[len-i+1];              c = 0;              if(s[len-i]!='0')                  c += b;              if(s[len-i]=='1' || s[len-i]=='2' && s[len-i+1] <= '6')                  c += a;              a = b;              b = c;          }          return  c;                }  };


0 0