Decode Ways

55 篇文章 0 订阅
A message containing letters from A-Z is being encoded to numbers using the following mapping:

'A' -> 1
'B' -> 2
...
'Z' -> 26
Given a non-empty string containing only digits, determine the total number of ways to decode it.

Example 1:

Input: "12"
Output: 2
Explanation: It could be decoded as "AB" (1 2) or "L" (12).
Example 2:

Input: "226"
Output: 3
Explanation: It could be decoded as "BZ" (2 26), "VF" (22 6), or "BBF" (2 2 6).

三个月前做的,三个月之后就做错了。

//错误解:只过了66.7%的测试用例
class Solution {
    
    
    private static int sum=0;
    public int numDecodings(String s) {
        
        sum=0;
        dfs(s,0);
        return sum;
        
    }
    
     private static void dfs(String str, int start) {

        if(start>=str.length())
        {
            sum=sum+1;
        }

        if(start<=str.length()-1)
        {
            if(str.charAt(start)!='0')
            {
                dfs(str,start+1);
            }

        }

        if(start<=str.length()-2)
        {
            String temp=str.substring(start,start+2);

            if(str.charAt(start)!='0')
            {
                int num=Integer.parseInt(temp);
                if(num>=1&&num<=26)
                {
                    dfs(str,start+2);
                }

            }


        }
    }
}


正确解://动态规划
//f(6)=f(5)+f(4)
//f(5)=f(4)+f(3)
//上面重复计算了f(4)
class Solution {
    public int numDecodings(String s) {
        
       
           
        
        int f[]=new int[s.length()+1];
        
        f[0]=1;
        
       
        
        for(int i=0;i<s.length();i++)
        {
            int value1=Integer.valueOf(s.substring(i,i+1));
            if(value1>=1&&value1<=9)
            {
                f[i+1] =f[i+1]+f[i];
            }
            
            if(i-1>=0)
            {
                int value2=Integer.valueOf(s.substring(i-1,i+1));
                if(value2>=10&&value2<=26)
                {
                    f[i+1]=f[i+1]+f[i-1];
                }
            }
        }
        
        return f[s.length()];
        
        
        
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值