Leetcode - 142双周赛

目录

一,3330. 找到初始输入字符串 I

二,3331. 修改后子树的大小

三,3332. 旅客可以得到的最多点数

四,3333. 找到初始输入字符串 II


一,3330. 找到初始输入字符串 I

本题就是一道找规律的题,拿示例一来说,假设Alice输入c时按的太久,那么会出现 "abbc","abbcc","abbccc","abbcccc" 四种可能的方案数,也就是说对于每个连续出现cnt次的字符,它们都会出现 cnt 种可能的方案,可以直接枚举,将所有cnt加起来,就是答案。

代码如下:

class Solution {public int possibleStringCount(String word) {int ans = 1;//word不变时的情况char[] ch = word.toCharArray();for(int j=1; j<ch.length; j++){if(ch[j-1] == ch[j]){ans++;}}return ans;}
}

二,3331. 修改后子树的大小

本题是一道关于树的问题,我们可以使用两次dfs,第一个dfs用来修改距离节点 x 最近的祖先节点y,唯一需要注意的点是,我们需要一个数组来记录对于每个节点,26个字母所对应的最近祖先,在不断更新这个数组时,我们需要进行回溯操作,第二个dfs就是简单的计算子树大小。

代码如下:

//双dfs
class Solution {public int[] findSubtreeSizes(int[] parent, String s) {int n = parent.length;List<Integer>[] g = new ArrayList[n];Arrays.setAll(g, e->new ArrayList<>());for(int i=1; i<n; i++){g[parent[i]].add(i);}Arrays.fill(cnt, -1);dfs(0, g, s.toCharArray());int[] ans = new int[n];tree(0, g, ans);return ans;}int[] cnt = new int[26];void dfs(int x, List<Integer>[] g, char[] s){int tmp = cnt[s[x]-'a'];cnt[s[x]-'a'] = x;//因为会不断的添加数据,g[x]的大小会变,这里提前记录sz避免出错//当然也可以倒叙遍历,这样可以不用szint sz = g[x].size();for(int i=0; i<sz; i++){int y = g[x].get(i);if(cnt[s[y]-'a']!=-1){g[cnt[s[y]-'a']].add(y);g[x].set(i, -1);}dfs(y, g, s);}cnt[s[x]-'a'] = tmp;}void tree(int x, List<Integer>[] g, int[] ans){ans[x] = 1;for(int y : g[x]){if(y != -1){tree(y, g, ans);ans[x] += ans[y];}}}
}//单dfs
class Solution {public int[] findSubtreeSizes(int[] parent, String s) {int n = parent.length;List<Integer>[] g = new ArrayList[n];Arrays.setAll(g, e->new ArrayList<>());for(int i=1; i<n; i++){g[parent[i]].add(i);}Arrays.fill(cnt, -1);int[] ans = new int[n];dfs(0, g, s.toCharArray(), ans);return ans;}int[] cnt = new int[26];//记录枚举到i节点时,26个字母的最近祖先节点void dfs(int x, List<Integer>[] g, char[] s, int[] ans){ans[x] = 1;int tmp = cnt[s[x]-'a'];cnt[s[x]-'a'] = x;for(int y : g[x]){dfs(y, g, s, ans);int anc = cnt[s[y]-'a'];ans[anc==-1?x:anc] += ans[y];//判断y节点是否有祖先节点t,使得s[y]==s[t]// if(anc != -1) ans[x] += ans[y];没有// else ans[anc] += ans[y];有}cnt[s[x]-'a'] = tmp;}
}

三,3332. 旅客可以得到的最多点数

本题假设第 0 天在第 1 座城市,那么接下来有两种情况:

  • 留在当前城市,问题变成第 1 天到第 k - 1 天,以第 0 座城市为起点时,可以获得的最多点数
  • 前往另一座城市 x,问题变成第 1 天到第 k - 1 天,以第 x 座城市为起点时,可以获得的最多点数

这样就不断形成子问题,所以我们可以使用dfs记忆化的方法来做本题,定义dfs(i,j):从 i~k-1 天,以第 j 座城市为起点时,可以获得的最多点数。分类讨论:

  • 留在当前城市,问题变成第 i+1 天到第 k - 1 天,以第 j 座城市为起点时,可以获得的最多点数,即 dfs(i,j) = dfs(i+1,j) + stayScore[i][j]
  • 前往另一座城市 x,问题变成第 i+1 天到第 k - 1 天,以第 x 座城市为起点时,可以获得的最多点数,即 dfs(i,j) = dfs(i+1,x) + stayScore[j][x]

代码如下:

class Solution {public int maxScore(int n, int k, int[][] s, int[][] t) {int ans = 0;memo = new int[k][n];for(int i=0; i<n; i++){ans = Math.max(ans, dfs(0, i, k, s, t));}return ans;}int[][] memo;int dfs(int i, int j, int k, int[][] s, int[][] t){if(i == k) return 0;if(memo[i][j] > 0) return memo[i][j];int res = dfs(i+1, j, k, s, t) + s[i][j];for(int d=0; d<t.length; d++){res = Math.max(res, dfs(i+1, d, k, s, t) + t[j][d]);}return memo[i][j] = res;}
}

递推写法

class Solution {public int maxScore(int n, int k, int[][] s, int[][] t) {int ans = 0;int[][] f = new int[k+1][n];for(int i=k-1; i>=0; i--){for(int j=0; j<n; j++){f[i][j] = f[i+1][j] + s[i][j];for(int d=0; d<n; d++){f[i][j] = Math.max(f[i][j], f[i+1][d] + t[j][d]);}}}for(int x : f[0]){ans = Math.max(ans, x);}return ans;}
}

四,3333. 找到初始输入字符串 II

本题是T1的升级版,这里Alice打入的任何一个连续且相同的字符都有可能是她的失误造成的,如果我们使用dfs枚举每一个连续字符可能出现的次数,且保证初始输入>= k,那么我们至少需要O(n*(n-k))的时间复杂度,这肯定会超时。

题目要求初始输入>= k的所有可能,那么我们可以正难则反,通过计算初始输入< k 可能出现的次数,然后使用总数 - (初始输入<k)= (初始输入>=k),总数非常好计算,统计每一段连续且相同的字符数量,将它们全都乘起来,就得到总数。

接下来使用dfs计算出初始输入< k 可能出现的次数,代码如下:

class Solution {private static final int MOD = 1_000_000_007;public int possibleStringCount(String word, int k) {char[] s = word.toCharArray();int cnt = 0;long total = 1;List<Integer> lst = new ArrayList<>();for(int i=0; i<s.length; i++){cnt++;if(i == s.length-1 || s[i] != s[i+1]){lst.add(cnt);total = total * cnt % MOD;cnt = 0;}}if(lst.size() >= k) return (int)total;memo = new long[lst.size()][k+1];long res = dfs(0, k, lst);return (int)(total - res + MOD)%MOD;}long[][] memo;//O(n*k)long dfs(int i, int k, List<Integer> g){if(k <= 0) return 0;//如果k<0,说明保留了至少k个字母,返回0if(i == g.size()) return 1;if(memo[i][k] > 0) return memo[i][k];long res = 0;for(int j=1; j<=g.get(i); j++){//保留j个相同字母res = (res + dfs(i+1, k-j, g))%MOD;}return res;}
}

这里运行时会发现会超时,因为dfs的时间复杂度为O(nk),还是太大了,是否还有其他优化的空间呢?在dfs中看不出来,所以我们把他写成递推再看看,代码如下:

class Solution {private static final int MOD = 1_000_000_007;public int possibleStringCount(String word, int k) {char[] s = word.toCharArray();int cnt = 0;long total = 1;List<Integer> lst = new ArrayList<>();for(int i=0; i<s.length; i++){cnt++;if(i == s.length-1 || s[i] != s[i+1]){lst.add(cnt);total = total * cnt % MOD;cnt = 0;}}if(lst.size() >= k) return (int)total;int n = lst.size();long[][] f = new long[n+1][k+1];Arrays.fill(f[n], 1);for(int i=0; i<n+1; i++) f[i][0] = 0;for(int i=n-1; i>=0; i--){long[] p = new long[k+1];for(int x=1; x<=k; x++){p[x] = (p[x-1] + f[i+1][x])%MOD;}for(int j=1; j<k+1; j++){f[i][j] = (p[j-1] - p[Math.max(0, j-lst.get(i)-1)])%MOD;// for(int x=1; x<=Math.min(j, lst.get(i)); x++){// 计算f[i+1][j-1]~f[i+1][j-Math.min(j, lst.get(i))]的和,使用前缀和优化//     f[i][j] = (f[i][j] + f[i+1][j-x])%MOD;// }}}return (int)((total - f[0][k])%MOD + MOD) % MOD;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/462869.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用python画一颗圣诞树

具体效果&#xff1a; 完整代码&#xff1a; import random def print_christmas_tree(height): # 打印圣诞树的顶部 for i in range(height): # 打印空格&#xff0c;使树居中 for j in range(height - i - 1): print(" ", end"") # 打印星号&…

camera和lidar外参标定

雷达和相机的外参标定&#xff08;外部参数标定&#xff09;指的是确定两者之间的旋转和平移关系&#xff0c;使得它们的坐标系可以对齐。 文章目录 无目标标定livox_camera_calibdirect_visual_lidar_calibration 有目标标定velo2cam_calibration 无目标标定 livox_camera_ca…

《使用Gin框架构建分布式应用》阅读笔记:p307-p392

《用Gin框架构建分布式应用》学习第16天&#xff0c;p307-p392总结&#xff0c;总86页。 一、技术总结 1.AWS chapter 08讲使用AWS进行部署&#xff0c;可以根据需要选择是否阅读。因为使用到的概率很小&#xff0c;且还要绑卡&#xff0c;本人选择跳过。 2.CI/CD (1)什么…

【初阶数据结构】实现顺序结构二叉树->堆(附源码)

文章目录 须知 &#x1f4ac; 欢迎讨论&#xff1a;如果你在学习过程中有任何问题或想法&#xff0c;欢迎在评论区留言&#xff0c;我们一起交流学习。你的支持是我继续创作的动力&#xff01; &#x1f44d; 点赞、收藏与分享&#xff1a;觉得这篇文章对你有帮助吗&#xff1…

ChatGPT变AI搜索引擎!以后还需要谷歌吗?

前言 在北京时间11月1日凌晨&#xff0c;正值ChatGPT两岁生日之际&#xff0c;OpenAI宣布推出最新的人工智能搜索体验&#xff01;具备实时网络功能&#xff01;与 Google 展开直接竞争。 ChatGPT搜索的推出标志着ChatGPT成功消除了即时信息这一最后的短板。 这项新功能可供 …

实用篇:Postman历史版本下载

postman历史版本下载步骤 1.官方历史版本发布信息 2.点进去1中的链接,往下滑动;选择你想要的版本 例如下载v11.18版本 3.根据操作系统选择 mac:mac系统postman下载 window:window系统postman下载 4.在old version里找到对应版本下载即可 先点击download 再点击free downlo…

提高后端接口性能的方法

个人bibilailai&#xff08;不喜请跳过&#xff09;&#xff1a;前几天参加的部门技术分享会&#xff0c;同事分享了一个内容为“提高接口性能的常见技巧”&#xff0c;个人觉得很有用&#xff0c;所以想在这里分享给大家&#xff0c;希望对刚入职场不久的兄弟姐妹们有所帮助。…

解决CentOS7 yum update异常:Could not retrieve mirrorlist

报错 Could not retrieve mirrorlist http://mirrorlist.centos.org/?release7&archx86_64&repoos&infrastock error was 14: curl#6 - "Could not resolve host: mirrorlist.centos.org; Unknown error" 解决 执行命令&#xff1a;切换目录&#xff0…

Mybatis查询数据库,返回List集合,集合元素也是List。

#有时间需求会要求&#xff1a;查询全校的学生数据&#xff0c;且学生数据按班级划分。那么就需要List<List<user>>类型的数据。 SQL语句 SELECT JSON_ARRAYAGG(JSON_OBJECT(name , name ,BJMC, BJMC ,BJBH,BJBH)) as dev_user FROM dev_user WHERE project_id …

Linux:防火墙和selinux对服务的影响

1-1selinux 1-1 SELinux是对程序、文件等权限设置依据的一个内核模块。由于启动网络服务的也是程序&#xff0c;因此刚好也 是能够控制网络服务能否访问系统资源的一道关卡。 1-2 SELinux是通过MAC的方式来控制管理进程&#xff0c;它控制的主体是进程&#xff0c;而目标则是…

论文阅读笔记Dense Passage Retrieval for Open-Domain Question Answering

前言 在开放域的问答系统中&#xff0c;我们需要从大量的文本数据中搜索匹配我们想要的答案&#xff08;或者学习文档的“信息知识”用于生成答案&#xff09;&#xff0c;而对每个问题都进行全文的数据“学习”是不现实的&#xff0c;因此往往依赖于高效的文本检索来选择候选…

书生大模型第四期 | L0G3000 git 基础知识

1、破冰行动 fork项目 PR链接&#xff1a;跳转访问 https://github.com/InternLM/Tutorial/pull/21632、构建个人项目 创建一个仓库保存LLM学习的笔记&#xff0c;以md文件为主 博客页面项目

List 列表基础用法

List 列表基础用法 列表可以完成大多数集合类的数据结构实现。列表中元素的类型可以不相同&#xff0c;它支持数字&#xff0c;字符串甚至可以包含列表&#xff08;所谓嵌套&#xff09;。 列表是写在方括号 [] 之间、用逗号分隔开的元素列表。 和字符串一样&#xff0c;列表…

从0开始学PHP面向对象内容之(类,对象,构造/析构函数)

上期我们讲了面向对象的一些基本信息&#xff0c;这期让我们详细的了解一下 一、面向对象—类 1、PHP类的定义语法&#xff1a; <?php class className {var $var1;var $var2 "constant string";function classfunc ($arg1, $arg2) {[..]}[..] } ?>2、解…

详细记录555定时器组成和工作原理(第一篇)

目录 一、创作灵感 二、CB555的电路结构图 1、比较器C1和C2 2、三个5KΩ串联组成的分压电路 3、由与非门G1和G2组成的SR锁存器 4、G3、G4、集电极开路的放电三极管TD 三、CB555引脚功能 1、CB555引脚功能描述 2、CB555的功能表 四、CB555施密特触发器 1、施密特触发器…

Linux_02 Linux常用软件——vi、vim

vi编辑器有三种主要模式&#xff0c;每种模式的功能和用途不同&#xff1a; 一、命令模式 (Command Mode)&#xff1a; - 启动 vi 时默认进入此模式。 - 你可以在此模式下移动光标&#xff0c;输入各种命令&#xff08;如删除、复制、粘贴等&#xff09;。 yy&#xff1a;…

C#与C++交互开发系列(十八):跨进程通信之命名管道(Named Pipes)

1、前言 在 C# 和 C 应用程序之间进行数据交换时&#xff0c;命名管道&#xff08;Named Pipes&#xff09;是一种简单高效的进程间通信&#xff08;IPC&#xff09;方式。命名管道提供了可靠的双向通信通道&#xff0c;适合用于同一台机器上的跨进程通信。本文将深入介绍如何…

uniapp的video视频属性打包app后层级过高

问题&#xff1a;在使用uniapp开发APP时&#xff0c;使用video标签显示视频发现H5可以正常展示&#xff0c;但是打包到APP后&#xff0c;它的层级过高&#xff0c;把底部导航都盖住了。 官网说明&#xff1a;uni-app官网 官网给了cover-view组件或plus.nativeObj.view、subNVue…

【linux 多进程并发】0302 Linux下多进程模型的网络服务器架构设计,实时响应多客户端请求

0302 多进程网络服务器架构 ​专栏内容&#xff1a; postgresql使用入门基础手写数据库toadb并发编程 个人主页&#xff1a;我的主页 管理社区&#xff1a;开源数据库 座右铭&#xff1a;天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物. 一、概…

SQLI LABS | Less-26 GET-Error Based-All Your SPACES And COMMENTS Belong To Us

关注这个靶场的其它相关笔记&#xff1a;SQLI LABS —— 靶场笔记合集-CSDN博客 0x01&#xff1a;过关流程 输入下面的链接进入靶场&#xff08;如果你的地址和我不一样&#xff0c;按照你本地的环境来&#xff09;&#xff1a; http://localhost/sqli-labs/Less-25/ 本关考察…