2023-1-23 刷题情况
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
最长理想子序列
题目描述
给你一个由小写字母组成的字符串 s 和一个整数 k 。如果满足下述条件则可以将字符串 t 视作是 理想字符串
t 是字符串 s 的一个子序列。
t 中每两个 相邻 字母在字母表中位次的绝对差值小于或等于 k 。
返回 最长 理想字符串的长度。
字符串的子序列同样是一个字符串并且子序列还满足可以经由其他字符串删除某些字符也可以不删除但不改变剩余字符的顺序得到。
注意字母表顺序不会循环。例如‘a’ 和 ‘z’ 在字母表中位次的绝对差值是 25 而不是 1 。
样例
样例输入
s = “acfgbd”, k = 2
s = “abcd”, k = 3
样例输出
4 最长理想字符串是 “acbd” 。该字符串长度为 4 所以返回 4 。
注意 “acfgbd” 不是理想字符串因为 ‘c’ 和 ‘f’ 的字母表位次差值为 3 。
4 最长理想字符串是 “abcd” 该字符串长度为 4 所以返回 4
提示
- 1 < = s . l e n g t h < = 1 0 5 1 <= s.length <= 10^5 1<=s.length<=105
- 0 < = k < = 25 0 <= k <= 25 0<=k<=25
- s 由小写英文字母组成 s 由小写英文字母组成 s由小写英文字母组成
思路
很类似与最长递增子序列问题但加了一些限制条件子序列之间的字典序相差不能超过k最初使用了 O ( n 2 ) O(n^2) O(n2)的朴素动态规划不出以外的超时了第二遍循环只需要在指定范围内查找即可可使用哈希表进行优化。
代码实现
class Solution {
public int longestIdealString(String s, int k) {
int[] set = new int[26];
for(int i = 0; i < s.length(); i++){
int c = s.charAt(i) - 'a';
for(int j = Math.max(c-k, 0); j <= Math.min(c+k, 25); j++)
set[c] = Math.max(set[c], set[j]);
set[c]++;
}
return Arrays.stream(set).max().getAsInt();
}
}