zoukankan      html  css  js  c++  java
  • Decode Ways

    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.

    开始想自顶向下求解,结果发现有些情况求解不出来,于是换成dp。

    主要思想:

    当一个字符串S[0,n] 再加上一个字符ch的时候.有如下两种情况

    1.字符串s[n]+ch的组合可以组成一个合法的字母,字符串S.append(ch) 的解是s[n-2] + 1个解,因为最后两个数字可能有两种组合

    2.字符串s[n]+ch的组合无法组成一个合法字母,但是ch是个合法字母,那么S.append(ch)的解应该就是s[n-1]的解,因为最后一个字符只能append上去,被解析成一个固定的a-z

    public class Solution {
        
        public boolean valid(String s) {
            if (Integer.parseInt(String.valueOf(s.charAt(0)))<1 || Integer.parseInt(String.valueOf(s.charAt(0)))>9) {
                return false;
            }
            int n = Integer.parseInt(s);
            if (n<=26 && n>=1) {
                return true;
            } else {
                return false;
            }
        }
        
        public int numDecodings(String s) {
            if (s==null||s.length()==0) {
                return 0;
            }
            if (s.length()==1&&valid(s)) {
                return 1;
            }
            int[] ans = new int[s.length()];
            if (!valid(String.valueOf(s.charAt(0)))) {
                return 0;
            } else {
                ans[0] = 1;
            }
            if (valid(String.valueOf(s.charAt(1)))) {
                ans[1] += 1;
            }
            if (valid(String.valueOf(s.charAt(0))+String.valueOf(s.charAt(1)))) {
                ans[1] += 1;
            }
            for (int i=2; i<s.length(); i++) {
                ans[i] = 0;
                if (valid(String.valueOf(s.charAt(i)))) {
                    ans[i] += ans[i-1];
                }
                if (valid(String.valueOf(s.charAt(i-1))+String.valueOf(s.charAt(i)))) {
                    ans[i] += ans[i-2];
                }
            }
    
            return ans[s.length()-1];
        }
    }
  • 相关阅读:
    开源权限框架shiro 入门
    Struts1.2入门笔记
    memcache概述
    教你如何将中文转换成全拼
    WPF第一章(XAML前台标记语言(Chapter02代码讲解))
    WPF第一章(XAML前台标记语言)
    WPF简介
    Activity以singleTask模式启动,intent传值的解决办法
    linux下查看文件编码以及编码转换
    Fedora 17字体美化
  • 原文地址:https://www.cnblogs.com/23lalala/p/3515011.html
Copyright © 2011-2022 走看看