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;}
}

 

 

相关内容

热门资讯

前端-session、jwt 目录:   (1)session (2&#x...
linux入门---制作进度条 了解缓冲区 我们首先来看看下面的操作: 我们首先创建了一个文件并在这个文件里面添加了...
关于测试,我发现了哪些新大陆 关于测试 平常也只是听说过一些关于测试的术语,但并没有使用过测试工具。偶然看到编程老师...
前缀和与对数器与二分法 1. 前缀和 假设有一个数组,我们想大量频繁的去访问L到R这个区间的和,...
nodejs:本地安装nvm实... 一、背景-使用不同版本node的原因 vue3+ts、nuxt3版本,node...
JAVA集合知识整理 Java集合知识整理 HashMap相关 HashMap的底层数据结构:jdk1.8之...
无刷直流电机介绍及单片机控制实... 无刷直流电机介绍及单片机控制实例前言基本概念优势与劣势使用寿命基本结构使用单片机控制实例电子调速器&...
fwdiary(2) dp2 1.传纸条  AcWing 275. 传纸条 - AcWing 走两条路,走一条最大的...
常用的DOS命令 常用的DOS命令 DOS(Disk Operating System,磁...
<C++> 类和对象(下) 1.const成员函数将const修饰的“成员函数”称之为const成员函数,cons...