当前位置: 首页 > news >正文

leetcode.2014 重复k次的最长子序列

题目描述

解题思路

这一题本来怎么才能获得通用因为乍一看感觉遍历时间代价非常直到后面看到提示

提示里面专门包含一个n < k * 8,这太反常了。后面仔细一想,有道理,最后答案的字符个数一定小于8,因为 字符 k一定小于字符串长度否则这个候选一定无法重复k

那么直接给了遍历信心

直接遍历2字母组合开始遍历直到8为止,满足条件候选尝试接第三个候选字符,第四个候选字符,直到接不了任何字母为止至于能否重复k直接遍历字符看看目前候选是否k

唯一需要关注哪些过滤条件

  • 首先每个字母出现频率进行次数统计
  • 候选每个字母出现频率必须>=k
  • 字符串每次匹配一次候选时候都要判断候选字符剩余个数能否支持k重复
  • 添加候选字符如果目前候选解里面包含这个候选字符添加候选字符字符候选个数m那么cnt[候选字符] >= m * k理论可以这样加速,但我懒没有实现)
  • 添加候选字符字典序优先添加这样返回结果直接返回candidate[0]就可以加速

代码

string longestSubsequenceRepeatedK(string s, int k) {
	vector<int> cnt;
	vector<string> candidate;
	cnt.resize(26);for(int i = 0; i < s.size(); i++){
		cnt[s[i] - 'a'] ++;}for(int i = 25; i >= 0; i--)if(cnt[i] >= k)
	candidate.emplace_back(string(1,i + 'a'));	for(int num = 2; num < 8; num++){
	vector<string> new_candidate;for(int i = 0; i < candidate.size(); i++){int remain = 0;char last = candidate[i].size() - 1;for(int q = 25 ; q >= 0; q--){
			remain = cnt[q];if(remain < k) continue;int curr_idx = 0;int curr_k = k;bool flag = true;for(int idx = 0; idx < s.size(); idx ++){if(flag && s[idx] == candidate[i][curr_idx]){if(curr_idx == last){if(s[idx] == q + 'a') remain--;if(remain < curr_k)break;
						curr_k --;if(curr_k == 0){
							new_candidate.emplace_back(candidate[i]+ char(q + 'a'));break;}
						flag = false;continue;}
					curr_idx = (curr_idx + 1)% candidate[i].size();}if(s[idx] == q + 'a'){
					remain --;if(!flag){
						curr_idx = 0;
						flag = true;}}}}	}if(new_candidate.empty()) break;
	candidate.swap(new_candidate);}if(candidate.empty()) return "";return candidate[0];
}

http://www.lqws.cn/news/548605.html

相关文章:

  • Deformable Transformer 详解
  • 本地缓存Caffeine详解(含与Spring Cache集成)
  • Java 工程智能化升级:飞算科技重构软件开发的技术范式
  • 电子电气架构 --- 涵盖“诊断与 ECU 平台”领域特有项目要求(上)
  • go写前端打包的自动化工具
  • 图像分割模型中的空间信息、上下文信息、空间路径、上下文路径到底是什么?有什么作用?
  • 大事件项目记录5-用户接口开发-更新用户头像
  • 未来已来:Deepoc大模型驱动的人机智能革命
  • ELK监控jar
  • 电商数据开发实践:深度剖析1688商品详情 API 的技术与应用
  • java中对象可达性分析 + 自动回收算法
  • Linux基本指令篇 —— tac指令
  • 导出docker-compse.yml中docker镜像成tar文件
  • 麒麟系统使用-运用VSCode运行.NET工程
  • swift 对象转Json
  • 分布式系统ID生成方案深度解析:雪花算法 vs UUID vs 其他主流方案
  • Hyperledger Fabric 入门笔记(二十)Fabric V2.5 测试网络进阶之Tape性能测试
  • Ubuntu 20.04 系统上运行 SLAM卡顿是什么原因
  • 免安装一键修复网络诊断 + 权限修复!打印机共享错误工具适配 Win7/10/11
  • Spring Boot 项目实训 - 图书信息网站
  • 移动端测试——如何解决iOS端无法打开弹窗式网页(Webkit)
  • canvas面试题200道
  • C++:string类(1)
  • 临床项目计划框架
  • java代码规范
  • 机器学习2——贝叶斯理论下
  • 【Linux手册】进程终止:进程退出和信号的响应机制
  • 微软全新开源的Agentic Web网络项目:NLWeb详解
  • 【C/C++】单元测试实战:Stub与Mock框架解析
  • 【世纪龙科技】吉利博瑞汽车车身诊断与校正仿真教学软件