leetcode 639 Decode Ways II
首先回顾一下decode ways I 的做法:链接
分情况讨论
if s[i]=='*'
考虑s[i]单独decode,由于s[i]肯定不会为0,因此我们可以放心的dp+=dp1
再考虑s[i-1]和s[i]decode,如果s[i-1]为*,那么**的组合共有15种(11,12,13.....,21,22..26),注意不是9*9=81种,因为我们是s[i-1]和s[i]一起decode,如果是38这样是大于26的
如果s[i-1]不为*,枚举s[i],组合起来小于26即可
if s[i]!='*'
考虑s[i]单独decode, 和decode ways I 一样,考虑s[i]为0的情况
再考虑s[i-1]和s[i] decode 如果s[i-1]为*, 那么 *和s[i]组合要小于26,直接枚举判断就行了
如果s[i-1]不为*,枚举s[i-1],组合起来小于26即可
不用条件运算符会更快,但用了代码会简洁很多
class Solution {
public:
int numDecodings(string s) {
int n=s.length();
if(n==) return ;
vector<int> dp(n+,);
long long dp1=,dp2=,now;
if(s[]!='') dp1=s[]=='*'?:;
for(int i=;i<n;i++){
if(s[i]=='*'){
now=dp1*;
if(s[i-]=='*') now+=i-<?:dp2*;
else{
for(int j=;j<;j++){
if(s[i-]!=''&&((s[i-]-'')*+j<=)) now+=i-<?:dp2;
}
}
}
else{
now=s[i]==''?:dp1;
if(s[i-]=='*'){
for(int j=;j<;j++){
if(j*+s[i]-''<=) now+=i-<?:dp2;
}
}
else{
if(s[i-]!=''&&((s[i-]-'')*+s[i]-''<=)) now+=i-<?:dp2;
}
}
dp2=dp1%();
dp1=now%();
}
return (int)dp1;
}
};
leetcode 639 Decode Ways II的更多相关文章
- [LeetCode] 639. Decode Ways II 解码方法 II
A message containing letters from A-Z is being encoded to numbers using the following mapping way: ' ...
- 639. Decode Ways II
A message containing letters from A-Z is being encoded to numbers using the following mapping way: ' ...
- leetcode 91 Decode Ways I
令dp[i]为从0到i的总方法数,那么很容易得出dp[i]=dp[i-1]+dp[i-2], 即当我们以i为结尾的时候,可以将i单独作为一个字母decode (dp[i-1]),同时也可以将i和i-1 ...
- [LeetCode] 91. Decode Ways 解码方法
A message containing letters from A-Z is being encoded to numbers using the following mapping: 'A' - ...
- leetcode@ [91] Decode Ways (Dynamic Programming)
https://leetcode.com/problems/decode-ways/ A message containing letters from A-Z is being encoded to ...
- Leetcode 91. Decode Ways 解码方法(动态规划,字符串处理)
Leetcode 91. Decode Ways 解码方法(动态规划,字符串处理) 题目描述 一条报文包含字母A-Z,使用下面的字母-数字映射进行解码 'A' -> 1 'B' -> 2 ...
- [LeetCode] Decode Ways II 解码方法之二
A message containing letters from A-Z is being encoded to numbers using the following mapping way: ' ...
- [Swift]LeetCode639. 解码方法 2 | Decode Ways II
A message containing letters from A-Z is being encoded to numbers using the following mapping way: ' ...
- 【leetcode】Decode Ways(medium)
A message containing letters from A-Z is being encoded to numbers using the following mapping: 'A' - ...
随机推荐
- Day044--javascript, ECMAScript
一. javascript JavaScript基础分为三个部分: ECMAScript:JavaScript的语法标准.包括变量.表达式.运算符.函数.if语句.for语句等. DOM:操作网页上的 ...
- log4net在C#项目里的配置
做个记录,这个可用.每次新项目配置从网上找来的都要配半天 这里不说这是什么,从哪来,为什么这样配置 App.config或其他.config文件里加入如下配置 <log4net> < ...
- 分布式监控系统开发【day38】:报警自动升级代码解析及测试(八)
一.报警自动升级代码解析 发送邮件代码 def action_email(self,action_obj,action_operation_obj,host_id,trigger_data): ''' ...
- CMDB服务器管理系统【s5day90】:创建资产更新服务器硬盘信息
1.创建硬件资产信息 import json from django.shortcuts import render,HttpResponse from django.views.decorators ...
- Docker:网络及数据卷设置 [四]
一.Docker网络设置 默认情况下,docker会创建一个桥接网卡[docker 0],docker有2种映射方式,一种是随机映射,一种是指定映射 提示:生产场景一般不使用随机映射,但是随机映射的好 ...
- Java NIO系列教程(一) Java NIO 概述
<I/O模型之四:Java 浅析I/O模型> 一.阻塞IO与非阻塞IO 阻塞IO: 通常在进行同步I/O操作时,如果读取数据,代码会阻塞直至有 可供读取的数据.同样,写入调用将会阻塞直至数 ...
- 用Java编写第一个区块链
原文地址:https://www.cnblogs.com/zacky31/p/9057193.html 目标: 创建一个最基本的“区块链” 实现一个简单的挖矿系统 前提: 对面向对象编程有一定的基础 ...
- String.intern() 方法__jdk1.6与jdk1.7/jdk1.8的不同
1.为什么要使用intern()方法 intern方法设计的初衷是为了重用string对象,节省内存 用代码实例验证下 public class StringInternTest { static f ...
- Entity Framework查询
Entity Framework是个好东西,虽然没有Hibernate功能强大,但使用更简便.今天整理一下常见SQL如何用EF来表达,Func形式和Linq形式都会列出来(本人更喜欢Func形式). ...
- day3-->深浅拷贝
import copy #浅拷贝 #copy.copy() #深拷贝 #copy.deepcopy() #赋值 #a = '123' #b = a a1 = 123123 a2 = 123123 #查 ...