5472. 重新排列字符串

题目难度Easy
给你一个字符串 s 和一个 长度相同 的整数数组 indices 。

请你重新排列字符串 s ,其中第 i 个字符需要移动到 indices[i] 指示的位置。

返回重新排列后的字符串。

示例 1:

输入:s = “codeleet”, indices = [4,5,6,7,0,2,1,3]
输出:“leetcode”
解释:如图所示,“codeleet” 重新排列后变为 “leetcode” 。
示例 2:

输入:s = “abc”, indices = [0,1,2]
输出:“abc”
解释:重新排列后,每个字符都还留在原来的位置上。
示例 3:

输入:s = “aiohn”, indices = [3,1,4,2,0]
输出:“nihao”
示例 4:

输入:s = “aaiougrt”, indices = [4,0,2,6,7,3,1,5]
输出:“arigatou”
示例 5:

输入:s = “art”, indices = [1,0,2]
输出:“rat”

提示:

s.length == indices.length == n
1 <= n <= 100
s 仅包含小写英文字母。
0 <= indices[i] < n
indices 的所有的值都是唯一的(也就是说,indices 是整数 0 到 n - 1 形成的一组排列)。

代码

class Solution:def restoreString(self, s: str, indices: List[int]) -> str:ret = list(s)for i, idx in enumerate(indices):ret[idx] = s[i]return ''.join(ret)

5473. 灯泡开关 IV

题目难度Medium
房间中有 n 个灯泡,编号从 0 到 n-1 ,自左向右排成一行。最开始的时候,所有的灯泡都是 关 着的。

请你设法使得灯泡的开关状态和 target 描述的状态一致,其中 target[i] 等于 1 第 i 个灯泡是开着的,等于 0 意味着第 i 个灯是关着的。

有一个开关可以用于翻转灯泡的状态,翻转操作定义如下:

选择当前配置下的任意一个灯泡(下标为 i )
翻转下标从 i 到 n-1 的每个灯泡
翻转时,如果灯泡的状态为 0 就变为 1,为 1 就变为 0 。

返回达成 target 描述的状态所需的 最少 翻转次数。

示例 1:

输入:target = “10111”
输出:3
解释:初始配置 “00000”.
从第 3 个灯泡(下标为 2)开始翻转 “00000” -> “00111”
从第 1 个灯泡(下标为 0)开始翻转 “00111” -> “11000”
从第 2 个灯泡(下标为 1)开始翻转 “11000” -> “10111”
至少需要翻转 3 次才能达成 target 描述的状态
示例 2:

输入:target = “101”
输出:3
解释:“000” -> “111” -> “100” -> “101”.
示例 3:

输入:target = “00000”
输出:0
示例 4:

输入:target = “001011101”
输出:5

提示:

1 <= target.length <= 10^5
target[i] == ‘0’ 或者 target[i] == ‘1’

思路

从左到右遍历字符串,每次相邻两个字符从0到1或从1到0变化则经过一次翻转

代码

class Solution {public int minFlips(String target) {int cnt = 0;char pre = '0';for (char ch: target.toCharArray()) {if (ch == '1' && pre == '0') {++cnt;} else if (ch == '0' && pre == '1') {++cnt;}pre = ch;}return cnt;}
}

5474. 好叶子节点对的数量

题目难度Medium
给你二叉树的根节点 root 和一个整数 distance 。

如果二叉树中两个 叶 节点之间的 最短路径长度 小于或者等于 distance ,那它们就可以构成一组 好叶子节点对 。

返回树中 好叶子节点对的数量 。

示例 1:

输入:root = [1,2,3,null,4], distance = 3
输出:1
解释:树的叶节点是 3 和 4 ,它们之间的最短路径的长度是 3 。这是唯一的好叶子节点对。
示例 2:

输入:root = [1,2,3,4,5,6,7], distance = 3
输出:2
解释:好叶子节点对为 [4,5] 和 [6,7] ,最短路径长度都是 2 。但是叶子节点对 [4,6] 不满足要求,因为它们之间的最短路径长度为 4 。
示例 3:

输入:root = [7,1,4,6,null,5,3,null,null,null,null,null,2], distance = 3
输出:1
解释:唯一的好叶子节点对是 [2,5] 。
示例 4:

输入:root = [100], distance = 1
输出:0
示例 5:

输入:root = [1,1,1], distance = 2
输出:1

提示:

tree 的节点数在 [1, 2^10] 范围内。
每个节点的值都在 [1, 100] 之间。
1 <= distance <= 10

思路

深搜递归,dfs函数返回以该节点为根的子树的叶子节点深度到此深度的叶子节点个数的哈希表,从而计算左右两个子树之间的『好叶子节点对』的数量。

代码

/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode() {}*     TreeNode(int val) { this.val = val; }*     TreeNode(int val, TreeNode left, TreeNode right) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
class Solution {private int ret = 0;private HashMap<Integer, Integer> dfs(TreeNode root, int distance) {HashMap<Integer, Integer> depthMap = new HashMap<>();       // depth -> number of nodesif (root.left == null && root.right == null) {depthMap.put(0, 1);return depthMap;}HashMap<Integer, Integer> leftMap = null, rightMap = null;if (root.left != null) {leftMap = dfs(root.left, distance);HashMap<Integer, Integer> tmp = new HashMap<>();for (Map.Entry<Integer, Integer> entry : leftMap.entrySet()) {tmp.put(entry.getKey() + 1, entry.getValue());}leftMap = tmp;}if (root.right != null) {rightMap = dfs(root.right, distance);HashMap<Integer, Integer> tmp = new HashMap<>();for (Map.Entry<Integer, Integer> entry : rightMap.entrySet()) {tmp.put(entry.getKey() + 1, entry.getValue());}rightMap = tmp;}if (leftMap != null && rightMap != null) {HashMap<Integer, Integer> tmp = new HashMap<>(rightMap);leftMap.forEach((k, v) -> {tmp.forEach((k1, v1) -> {if ((k + k1) <= distance) {ret += v * v1;}});});for (Map.Entry<Integer, Integer> entry : rightMap.entrySet()) {int rightDepth = entry.getKey();if (leftMap.containsKey(rightDepth)) {leftMap.put(rightDepth, entry.getValue() + leftMap.get(rightDepth));} else {leftMap.put(rightDepth, entry.getValue());}}return leftMap;}return leftMap == null? rightMap: leftMap;}public int countPairs(TreeNode root, int distance) {ret = 0;dfs(root, distance);return ret;}
}

5462. 压缩字符串 II

题目难度Hard
行程长度编码 是一种常用的字符串压缩方法,它将连续的相同字符(重复 2 次或更多次)替换为字符和表示字符计数的数字(行程长度)。例如,用此方法压缩字符串 “aabccc” ,将 “aa” 替换为 “a2” ,“ccc” 替换为` “c3” 。因此压缩后的字符串变为 “a2bc3” 。

注意,本问题中,压缩时没有在单个字符后附加计数 ‘1’ 。

给你一个字符串 s 和一个整数 k 。你需要从字符串 s 中删除最多 k 个字符,以使 s 的行程长度编码长度最小。

请你返回删除最多 k 个字符后,s 行程长度编码的最小长度 。

示例 1:

输入:s = “aaabcccd”, k = 2
输出:4
解释:在不删除任何内容的情况下,压缩后的字符串是 “a3bc3d” ,长度为 6 。最优的方案是删除 ‘b’ 和 ‘d’,这样一来,压缩后的字符串为 “a3c3” ,长度是 4 。
示例 2:

输入:s = “aabbaa”, k = 2
输出:2
解释:如果删去两个 ‘b’ 字符,那么压缩后的字符串是长度为 2 的 “a4” 。
示例 3:

输入:s = “aaaaaaaaaaa”, k = 0
输出:3
解释:由于 k 等于 0 ,不能删去任何字符。压缩后的字符串是 “a11” ,长度为 3 。

提示:

1 <= s.length <= 100
0 <= k <= s.length
s 仅包含小写英文字母

思路

动态规划。dp[i][j]表示从i开始的字符串最多删除j个元素之后的最短行程编码长度。状态转移按每个字符是否需要删掉进行讨论。

代码

class Solution {public int getLengthOfOptimalCompression(String s, int k) {int n = s.length();int[][] dp = new int[n+1][k+1];for (int i=0; i<n; ++i) {Arrays.fill(dp[i], Integer.MAX_VALUE);}Arrays.fill(dp[n], 0);for (int i=n-1; i>=0; --i) {for (int j=0; j<=k; ++j) {if (j > 0) {dp[i][j] = Math.min(dp[i+1][j-1], dp[i][j]);}int cont = 1, remain = j;for (int cur=i+1; cur<=n; ++cur) {dp[i][j] = Math.min(dp[cur][remain] + 1 + (cont >= 100? 3: (cont >= 10? 2: (cont > 1? 1: 0))), dp[i][j]);if (cur == n) {break;}if (s.charAt(cur) == s.charAt(i)) {++cont;} else {if (remain == 0) {break;}--remain;}}}}return dp[0][k];}
}

LeetCode Weekly Contest 199相关推荐

  1. LeetCode Weekly Contest 25 之 545.Boundary of Binary Tree

    LeetCode Weekly Contest 25 赛题 本次周赛主要分为以下4道题: 507 Perfect Number (3分) 537 Complex Number Multiplicati ...

  2. LeetCode weekly contest 190 周赛

    5/23/20 第二次打周赛.全部通过AC.纪念一下.最后一题DP用的不是最优解,写了2次bug version. 可以去Github直接看我其他leetcode代码. Q1455_Check If ...

  3. LeetCode Weekly Contest 185

    5388. 重新格式化字符串 给你一个混合了数字和字母的字符串 s,其中的字母均为小写英文字母. 请你将该字符串重新格式化,使得任意两个相邻字符的类型都不同.也就是说,字母后面应该跟着数字,而数字后面 ...

  4. LeetCode——Weekly Contest 314

    LeetCode周赛第314场记录 2432. 处理用时最长的那个任务的员工 周赛第一题,根据题意写出代码即可.首先根据logs计算出每项工作的实际用时,然后根据用时长短对员工的ID号进行排序即可.给 ...

  5. LeetCode Weekly Contest 194

    1486. 数组异或操作 给你两个整数,n 和 start . 数组 nums 定义为:nums[i] = start + 2*i(下标从 0 开始)且 n == nums.length . 请返回 ...

  6. LeetCode Weekly Contest 27

    Reverse Words in a String III 简单暴力翻转 class Solution { public:string rev(string s){int len=s.length() ...

  7. LeetCode Weekly Contest 142

    又是两道题目,感觉rank要掉了呀~ 第一道看错题目了,然后浪费了很长时间,第三道很简单,思路也有,但是没时间了. 1093. Statistics from a Large Sample We sa ...

  8. LeetCode笔记:Weekly Contest 280

    LeetCode笔记:Weekly Contest 280 1. 题目一 1. 解题思路 2. 代码实现 2. 题目二 1. 解题思路 2. 代码实现 3. 题目三 1. 解题思路 2. 代码实现 4 ...

  9. C/C++描述 LeetCode 周赛 第199场周赛(阿里云专场)

    C/C++描述 LeetCode 周赛 第199场周赛(阿里云专场)   大家好,我叫亓官劼(qí guān jié ),在CSDN中记录学习的点滴历程,时光荏苒,未来可期,加油~博主目前仅在CSDN ...

最新文章

  1. Matlab实用程序--图形应用-交互式图形
  2. 信息系统项目管理师-组织级项目管理与大型项目管理知识点
  3. IIS解决 上传文件大小限制
  4. Ubuntu root账号的使用
  5. [刷题]算法竞赛入门经典(第2版) 5-2/UVa1594 - Ducci Sequence
  6. Noip2008提高组初赛 C
  7. 【汇编】堆栈平衡、外平栈与内平栈
  8. python复数类型及其特点_python中的复数类型
  9. xsmax无法进入dfu模式_iPhone XR/XS/XS Max 如何进入恢复模式或 DFU 模式?
  10. leetcode 347
  11. 人工智能顶级会议与国际期刊总结
  12. 【汇正财经】短线交易行为的构成问题
  13. 你PICK的球队可能没赢,但PICK以下拍摄技巧绝对稳赚不赔!
  14. js递归处理删除某些节点
  15. iOS RunTime机制----让catagory能够增加属性
  16. 工行二维码支付接口及回调接口
  17. [CVPR2020最佳论文详细解读] Unsupervised Learning of Probably Symmetric Deformable 3D Object
  18. Minecraft 1.12.2 彩色渐变字体 模组发布
  19. javascript取本周星期一到星期天对应日期的通用方法
  20. App Cleaner Uninstaller Pro for Mac v8.0.3 APP卸载删除软件

热门文章

  1. Java---反射机制
  2. 华硕(ASUS)M50S81VN-SL外接 Dell 2209wa出现水波纹
  3. 系统架构设计师2009-2022历年综合知识、案例分析、论文真题及答案详细解析
  4. Happy 2004(代码+积性函数扩展)
  5. 四、移植 JZ2440 开发板
  6. laravel mysql sum,Laravel 数据库操作
  7. 基于JavaWeb的网上购物系统开发(含代码)
  8. Spring|Spring概述
  9. python_torch_加载数据集_构建模型_构建训练循环_保存和调用训练好的模型
  10. 深入浅出医学注册配准