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];
        }
    }
  • 相关阅读:
    Mybatis问题记录-狂神版
    Uni-App开发记录
    某笔试题目--修复回文
    人生就是一个苏醒的过程
    今天早上进入你的空间突然发现咱们以前的东西都不见了,点开你的情侣空间.....
    青春物语
    中小学、幼儿园教师资格认定
    换屏
    oracle 语句
    Packet for query is too large (1057 > 1024)解决
  • 原文地址:https://www.cnblogs.com/23lalala/p/3515011.html
Copyright © 2011-2022 走看看