0121 动态规划 Day10
创始人
2024-04-20 22:35:17
0

剑指 Offer 46. 把数字翻译成字符串 

给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。

示例 1:

输入: 12258
输出: 5
解释: 12258有5种不同的翻译,分别是"bccfi", "bwfi", "bczi", "mcfi"和"mzi"

class Solution {public int translateNum(int num) {}
}

解题思路

动态规划解析:

字符串遍历

 

 

 

代码如下

class Solution {public int translateNum(int num) {String s = String.valueOf(num);int a = 1, b = 1;for(int i = 2; i <= s.length(); i++) {String tmp = s.substring(i - 2, i);int c = tmp.compareTo("10") >= 0 && tmp.compareTo("25") <= 0 ? a + b : a;b = a;a = c;}return a;}
}

使用数字求余节省空间

运用 求余 和 求整 运算实现,可实现 从右向左 的动态规划计算。而根据上述动态规划 “对称性” ,可知从右向左计算是正确的。

 

 

 

 

 

 

 

 

 

 

 

 

代码如下

class Solution {public int translateNum(int num) {int a = 1, b = 1, x, y = num % 10;while(num > 9) {num /= 10;x = num % 10;int tmp = 10 * x + y;int c = (tmp >= 10 && tmp <= 25) ? a + b : a;b = a;a = c;y = x;}return a;}
}

剑指 Offer 48. 最长不含重复字符的子字符串 

请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。

示例 1:

输入: "abcabcbb"
输出: 3 
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:

输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。

class Solution {public int lengthOfLongestSubstring(String s) {}
}

解题思路 

动态规划解析:
状态定义: 设动态规划列表 dp ,dp[j] 代表以字符 s[j] 为结尾的 “最长不重复子字符串” 的长度。

转移方程: 固定右边界 j,设字符 s[j] 左边距离最近的相同字符为 s[i] ,即 s[i]=s[j] 。

当 i<0 ,即s[j] 左边无相同字符,则 dp[j] = dp[j-1] + 1 ;
当 dp[j−1] 当 dp[j−1]≥j−i ,说明字符s[i] 在子字符串 dp[j−1] 区间之中 ,则 dp[j] 的左边界由 s[i] 决定,即 dp[j] = j - i ;

返回值: max(dp) ,即全局的 “最长不重复子字符串” 的长度。

动态规划 + 哈希表
哈希表统计: 遍历字符串 s 时,使用哈希表(记为 dic )统计 各字符最后一次出现的索引位置 。
左边界 i 获取方式: 遍历到s[j] 时,可通过访问哈希表 dic[s[j]]获取最近的相同字符的索引 i 。

 

 

 

 

 

 

 

 

 

代码如下

class Solution {public int lengthOfLongestSubstring(String s) {Map dic = new HashMap<>();int res = 0, tmp = 0, len = s.length();for(int j = 0; j < len; j++) {int i = dic.getOrDefault(s.charAt(j), -1); // 获取索引 idic.put(s.charAt(j), j); // 更新哈希表tmp = tmp < j - i ? tmp + 1 : j - i; // dp[j - 1] -> dp[j]res = Math.max(res, tmp); // max(dp[j - 1], dp[j])}return res;}
}

 

 

相关内容

热门资讯

银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...
【NI Multisim 14...   目录 序言 一、工具栏 🍊1.“标准”工具栏 🍊 2.视图工具...
AWSECS:访问外部网络时出... 如果您在AWS ECS中部署了应用程序,并且该应用程序需要访问外部网络,但是无法正常访问,可能是因为...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...
AWSElasticBeans... 在Dockerfile中手动配置nginx反向代理。例如,在Dockerfile中添加以下代码:FR...
Android|无法访问或保存... 这个问题可能是由于权限设置不正确导致的。您需要在应用程序清单文件中添加以下代码来请求适当的权限:此外...
月入8000+的steam搬砖... 大家好,我是阿阳 今天要给大家介绍的是 steam 游戏搬砖项目,目前...
​ToDesk 远程工具安装及... 目录 前言 ToDesk 优势 ToDesk 下载安装 ToDesk 功能展示 文件传输 设备链接 ...
北信源内网安全管理卸载 北信源内网安全管理是一款网络安全管理软件,主要用于保护内网安全。在日常使用过程中,卸载该软件是一种常...
AWS管理控制台菜单和权限 要在AWS管理控制台中创建菜单和权限,您可以使用AWS Identity and Access Ma...