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];
        }
    }
  • 相关阅读:
    Codeforces Round #555 (Div. 3) A B C1(很水的题目)
    蓝桥杯国赛之阶乘位数
    POJ-1258 Agri-Net(最小生成树)
    昂贵的聘礼(枚举区间+最短路)
    地斗主(矩阵快速幂)
    救救兔子(二分)
    shell编程之sed编辑器&gawk程序
    typedef&nbsp;struct与struct的区别
    iOS内存管理编程指南
    Object&nbsp;c&nbsp;基础知识
  • 原文地址:https://www.cnblogs.com/23lalala/p/3515011.html
Copyright © 2011-2022 走看看