博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
leetcode -- Decode Ways
阅读量:6327 次
发布时间:2019-06-22

本文共 2120 字,大约阅读时间需要 7 分钟。

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.

[解题思路]

本题一开始没有思路,上网搜索后发现与上楼梯那题类似

使用动态规划来解决问题,使用动态规划的目的是降低问题维度,通过解决子问题来来求解原问题

在求解子问题的过程中通过memoization来避免计算重复子问题,不过由于需要存储子问题的解,因而会有额外的空间消耗

令f(n)表示长度为n的输入解码方法,则有如下状态迁移方程:

f(n) = f(n-1) + f(n-2);                                             //s[n] is valid encoding char && s[n-1][n] is valid encoding char

f(n) = f(n-1);                                                          //s[n] is valid encoding char while s[n-1][n] is not valid encoding char 

f(n) = f(n-2);                                                          //s[n] is not valid encoding char && s[n-1][n] is valid encoding char

f(n) = 0;                                                                 //s[n] is not valid encoding char && s[n-1][n] is not valid encoding char

1 private static int generate(String s) { 2         int len = s.length(); 3         if (0 == len || s.charAt(0) == '0') { 4             return 0; 5         } 6         int[] dp = new int[len + 1]; 7         dp[0] = 1; 8         dp[1] = 1; 9         for (int i = 2; i < len + 1; i++) {10             char curChar = s.charAt(i - 1);11             int curNum = curChar - '0';12             // s[i] is not valid13             if (curNum == 0) {14                 String twoNum = s.substring(i - 2, i);15                 // s[i-1][i] is valid16                 if (Integer.parseInt(twoNum) <= 2617                         && Integer.parseInt(twoNum) >= 10) {18                     dp[i] = dp[i - 2];19                 } else {20                     dp[i] = 0;21                 }22             }23             // s[i] is valid24             else {25                 String twoNum = s.substring(i - 2, i);26                 // s[i-1][i] is valid27                 if (Integer.parseInt(twoNum) <= 2628                         && Integer.parseInt(twoNum) >= 10) {29                     dp[i] = dp[i - 1] + dp[i - 2];30                 } else {31                     dp[i] = dp[i - 1];32                 }33             }34         }35 36         return dp[len];37     }

 

转载地址:http://lnlaa.baihongyu.com/

你可能感兴趣的文章
简单的android提交数据(转)
查看>>
Account Attributes[账户属性]
查看>>
程序性能优化
查看>>
C# FTP 坑了我两天的一个坑
查看>>
网页列表设计
查看>>
(二)UIMA CPE
查看>>
mac 无法登录mysql的解决办法
查看>>
RedisCluster集群搭建
查看>>
$.ajax各个参数的意思
查看>>
Spring Struts Hibernate的工作流程
查看>>
centos7设置系统环境变量
查看>>
Spring Boot 2.2 增加了一个新功能,启动飞起~
查看>>
RunTime.getRunTime().addShutdownHook用法
查看>>
linux 常用命令
查看>>
OpenDaylight Controller:MD-SAL:Startup Project Archetype
查看>>
Mac OS svn配置使用以及冲突解决
查看>>
布局之LinearLayout(线性布局)详解
查看>>
Android HTML & XML 转义字符
查看>>
微信app支付不成功
查看>>
mysql设计规范之运维规范
查看>>