编码方式(dp)
时间:2019-09-28
本文章向大家介绍编码方式(dp),主要包括编码方式(dp)使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
LeetCode 91. Decode Ways
题目:https://leetcode.com/problems/decode-ways/
描述:按照一下规则编码,给出一段由数字组成的字符串,判断可能得出的解码结果有多少种?
'A' -> 1 'B' -> 2 ... 'Z' -> 26
解析:类似于12,1既可以单独编码作为A,也可以和2一起作为L,所以可以想到是动态规划问题。那么久需要找出最优子问题。
假设dp(i)表示为第i个数开始的字符串能解码出的结果数,那么
dp(i)=dp(i+1),当第i个数单独编码时,
或dp(i)=dp(i+2),当第i个数和第i+1个数一起编码时。
这道题的通过率较低,主要原因就是有0这个边界条件。
当第i个数为0时,它无法单独编码,也无法和后面的数一起编码,因此此时dp[i]=0。
而只有第i个数为1或者第i个数为2且后面的数小于等于6时,才能一起编码。
另外,一旦字符串中出现了无法编码的情况,则整个字符串能解码的结果都为0。这些情况包括:1)首个字符为0;2)连续出现两个0;3)0前面出现的数大于2。我们可以先排除所有无法编码的情况,这可以减少计算量。
class Solution { public: int numDecodings(string s) { int n = s.size(); if (!isValid(s)) return 0; int dp[n + 1]; dp[n] = 1; dp[n - 1] = s[n - 1] != '0'; for (int i = n - 2; i >= 0; --i) { if (s[i] == '0') dp[i] = 0; else if (s[i] == '1' || (s[i] == '2' && s[i + 1] <= '6')) dp[i] = dp[i + 1] + dp[i + 2]; else dp[i] = dp[i+1]; } return dp[0]; } bool isValid(string &s) { if (s.empty() || s[0] == '0') return false; char pre = s[0], cur; for (int i = 1; i < s.size(); ++i) { if (s[i] == '0') { if (s[i - 1] == '0' || s[i - 1] > '2') return false; } } return true; } };
由于动态规划是从后往前遍历,如果不先排除无法编码的情况,在首个字符为0等非法情况下依然需要遍历所有的字符串。当然,这不影响算法的思路。
原文地址:https://www.cnblogs.com/vimery/p/11604203.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 网络安全 | 瑞哥带你全方位解读防火墙技术!
- 【SpringBoot DB 系列】Jooq 之新增记录使用姿势
- 突击并发编程JUC系列-并发工具 Semaphore
- 构建Linux根文件系统
- ARM指令ldr和adr的区别
- 挂载文件系统出现"kernel panic..." 史上最全解决方案
- 汇编程序调用c函数为什么需要设置栈?
- Uboot到底如何启动内核
- Flink部署及作业提交(On YARN)
- Flink部署及作业提交(On Flink Standalone)
- MySQL题集
- 《深入浅出SQL》问答录
- Python_字典实现简单预约系统
- java_二维数组简单快递系统
- RabbitMQ六种工作模式