leetcode 91. Decode Ways DP动态规划+DFS深度优先遍历

来源:互联网 发布:java初学者视频教程 编辑:程序博客网 时间:2024/06/06 07:13

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.

这道题考察的是解码,本质就是DFS深度优先遍历。不过网上看了一个基于DP的解决方法,也很简答。

代码如下:

import java.util.Arrays;public class Solution{    int res=0;    public int numDecodings(String s)    {        if(s==null || s.length()<=0)            return res;        //DP 做法        int []nums=new int[s.length()+1];        //num[0]必须初始化为1        nums[0]=1;        nums[1]=s.charAt(0)=='0'? 0:1;        //下面是动态规划去实现,        for(int i=2;i<=s.length();i++)        {            if (s.charAt(i - 1) != '0')                  nums[i] = nums[i - 1];              if (s.charAt(i - 2) != '0' && Integer.parseInt("" + s.charAt(i - 2) + s.charAt(i - 1)) < 27)                  nums[i] += nums[i - 2];          }         return nums[s.length()];    }    private void getNum(String s, int index)     {        if(index==s.length())            res++;        else        {            int a=(int)(s.charAt(index)-'0');            if(a==0)                return;            getNum(s, index+1);            if(index+1 < s.length() && a<=2 && a*10+(int)(s.charAt(index+1)-'0')<=26)                getNum(s, index+2);        }    }}

下面是C++的做法,就是一个DP动态规划问题,这个和斐波那契额序列很像

代码如下:

#include <iostream>#include <algorithm>#include <vector>using namespace std;class Solution {public:    int numDecodings(string s)     {        if (s.size() <= 0)            return 0;        vector<int> dp(s.length() + 1, 0);        dp[0] = 1;        dp[1] = s[0] >= '1' && s[0] <= '9' ? 1 : 0;        for (int i = 2; i <= s.length(); i++)        {            if (s[i - 1] != '0')                dp[i] = dp[i - 1];            int one = (int)(s[i - 2] - '0') * 10 + (int)(s[i - 1] - '0');            if (s[i - 2] != '0' && one <= 26)                dp[i] += dp[i - 2];        }        return dp[s.length()];    }};
原创粉丝点击