【贪心】【回溯】【字符串】2014. 重复 K 次的最长子序列

本文涉及知识点

贪心 回溯 字符串

LeetCode2014. 重复 K 次的最长子序列

给你一个长度为 n 的字符串 s ,和一个整数 k 。请你找出字符串 s 中 重复 k 次的 最长子序列 。
子序列 是由其他字符串删除某些(或不删除)字符派生而来的一个字符串。
如果 seq * k 是 s 的一个子序列,其中 seq * k 表示一个由 seq 串联 k 次构造的字符串,那么就称 seq 是字符串 s 中一个 重复 k 次 的子序列。
举个例子,“bba” 是字符串 “bababcba” 中的一个重复 2 次的子序列,因为字符串 “bbabba” 是由 “bba” 串联 2 次构造的,而 “bbabba” 是字符串 “bababcba” 的一个子序列。
返回字符串 s 中 重复 k 次的最长子序列 。如果存在多个满足的子序列,则返回 字典序最大 的那个。如果不存在这样的子序列,返回一个 空 字符串。
示例 1:
example 1
输入:s = “letsleetcode”, k = 2
输出:“let”
解释:存在两个最长子序列重复 2 次:let" 和 “ete” 。
“let” 是其中字典序最大的一个。
示例 2:
输入:s = “bb”, k = 2
输出:“b”
解释:重复 2 次的最长子序列是 “b” 。
示例 3:
输入:s = “ab”, k = 2
输出:“”
解释:不存在重复 2 次的最长子序列。返回空字符串。

提示:
n == s.length
2 <= k <= 2000
2 <= n < k * 8
s 由小写英文字母组成

回溯

因为n < k*8, 则最多7个字符。
string s1 记录 出现数量>=k次的字符。如果一个字符出现m × \times ×k次,则记录m次。
枚举mask ∈ \in [1,1 << s1.length()]。
for(int i= 0 ; i < s1.length();i++ )
{
if(mask&(1<<i))
{
s2 += s1[i];
}
}
将s2 降序排序,计算是否存在k个为s2的子序列。如果有,直接返回;否则,用系统函数prev_permutation计算前一个字典序。

代码

核心代码

class Solution {
public:string longestSubsequenceRepeatedK(string s, int k) {m_s = s;m_iK = k;int cnt[26] = { 0 };for (const auto& ch : s){cnt[ch - 'a']++;}string s1;for (int i = 0; i < 26; i++){s1 += string(cnt[i] / k, 'a' + i);}const int n = s1.length();for (int i = 1; i < (1 << n); i++){string s2;for (int j = 0; j < n; j++){if (i & (1 << j)){s2 += s1[j];}}Do(s2);}return m_res.empty() ? "" : m_res.rbegin()->second;}void Do(string& s2){sort(s2.begin(), s2.end(), std::greater<>());do{int cnt = 0;for (const auto& ch : m_s){if (ch == s2[cnt % s2.length()]){cnt++;}}if (cnt >= m_iK * s2.length()){m_res.emplace(s2.length(), s2);if (m_res.size() > 1){m_res.erase(m_res.begin());}}} while (prev_permutation(s2.begin(), s2.end()));}set<pair<int, string>> m_res;string m_s;int m_iK;
};

2023年5月版

class Solution {
public:
string longestSubsequenceRepeatedK(string s, int k) {
m_s = s;
m_c = s.length();
m_iK = k;
m_vFreq.resize(26);
for (const char&ch : s)
{
m_vFreq[ch - ‘a’]++;
}
for (int len = 7; len > 0; len–)
{
string str = dfs(“”, len);
if (str.length())
{
return str;
}
}
return “”;
}
string dfs(string str,int leve)
{
if (0 == leve)
{
return Do(str)?str:“”;
}
for (int i = 25; i >= 0; i–)
{
if (m_vFreq[i] < m_iK)
{
continue;
}
m_vFreq[i] -= m_iK;
string strRet = dfs(str + char(i + ‘a’), leve - 1);
if (strRet.length())
{
return strRet;
}
m_vFreq[i] += m_iK;
}
return “”;
}
bool Do(const string& strSub)
{
int iSBegin = 0;
int i = 0, k =0;
for (; iSBegin < m_c; iSBegin++)
{
if (strSub[i] == m_s[iSBegin])
{
i++;
}
if (strSub.length() == i)
{
i = 0;
k++;
}
if (m_iK == k)
{
return true;
}
}
return false;
}
int m_c;
string m_s;
int m_iK;
vector m_vFreq;
};

2023年7月

class Solution {
public:
string longestSubsequenceRepeatedK(string s, int k) {
m_c = s.length();
m_iK = k;
m_s = s;
m_vNums.assign(m_c+1, vector(26));
/*
for (int i = m_c - 1; i >= 0; i–)
{
m_vNums[i] = m_vNums[i + 1];
m_vNums[i][s[i] - ‘a’]++;
}
/
for (int i = 0; i < m_c; i++)
{
m_vIndexs[s[i] - ‘a’].emplace_back(i);
}
vector cur;
int aUse[26] = { 0 };
dfs(cur, aUse, 0);
return m_strRet;
}
void dfs(vector& cur,int
aUse, int iCurIndex)
{
for (int i = 0; i < 26; i++)
{
const auto& v = m_vIndexs[i];
int index = std::lower_bound(v.begin(), v.end(), iCurIndex) - v.begin();
if (index >= v.size())
{
continue;
}
cur.push_back(i);
aUse[i]++;
if (Check(cur, aUse, v[index] + 1))
{
dfs(cur, aUse, v[index] + 1);
}
cur.pop_back();
aUse[i]–;
}
}
bool Check(const vector& cur, int* aUse, int iCurIndex)
{
for (int i = 1; i < m_iK; i++)
{
for (const auto& ch : cur)
{
const auto& v = m_vIndexs[ch];
int index = std::lower_bound(v.begin(), v.end(), iCurIndex) - v.begin();
if (index >= v.size())
{
return false;
}
iCurIndex = v[index] + 1;
}
}
string ret;
for (const auto& tmp : cur)
{
ret += ‘a’ + tmp;
}
if (ret.length() > m_strRet.length())
{
m_strRet = ret;
}
else if (ret.length() == m_strRet.length())
{
if (ret > m_strRet)
{
m_strRet = ret;
}
}
return true;
}
int m_c;
vector<vector> m_vNums;
std::vector m_vIndexs[26];
int m_iK;
string m_s;
string m_strRet;
};

扩展阅读

视频课程

有效学习:明确的目标 及时的反馈 拉伸区(难度合适),可以先学简单的课程,请移步CSDN学院,听白银讲师(也就是鄙人)的讲解。
https://edu.csdn.net/course/detail/38771

如何你想快速形成战斗了,为老板分忧,请学习C#入职培训、C++入职培训等课程
https://edu.csdn.net/lecturer/6176

相关

下载

想高屋建瓴的学习算法,请下载《喜缺全书算法册》doc版
https://download.csdn.net/download/he_zhidan/88348653

我想对大家说的话
闻缺陷则喜是一个美好的愿望,早发现问题,早修改问题,给老板节约钱。
子墨子言之:事无终始,无务多业。也就是我们常说的专业的人做专业的事。
如果程序是一条龙,那算法就是他的是睛

测试环境

操作系统:win7 开发环境: VS2019 C++17
或者 操作系统:win10 开发环境: VS2022 C++17
如无特殊说明,本算法用**C++**实现。

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

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

相关文章

网络安全笔记-day6,NTFS安全权限

文章目录 NTFS安全权限常用文件系统文件安全权限打开文件安全属性修改文件安全权限1.取消父项继承权限2.添加用户访问权限3.修改用户权限4.验证文件权限5.总结权限 强制继承父项权限文件复制移动权限影响跨分区同分区 总结1.权限累加2.管理员最高权限2.管理员最高权限 NTFS安全…

仿京东项目——京西商城(数据库设计)

文章目录 仿京东——京西商城数据库设计建立E-R图数据库表设计用户表商品表订单表订单详情表评论表购物车表购物车项表 仿京东——京西商城 数据库设计 主要实体有&#xff1a; 用户 用户ID&#xff08;User_ID&#xff09;&#xff1a;唯一标识用户的主键 用户名&#xff0…

同豪BIM模型如何快速修改路面、桥面、梁板颜色

0序 同豪的建模软件&#xff0c;做路桥隧的bim建模&#xff0c;速度很快。缺点就是他们的模型可以认为是没有颜色。只有自带的几种风格、纹理。 部分领导觉得颜色不好看&#xff0c;与背景色对比度不强&#xff0c;甚至甲方也会要求修改模型颜色&#xff0c;使之更醒目&#x…

数字乡村引领新风尚:科技赋能农村实现全面进步

随着信息技术的迅猛发展&#xff0c;数字乡村正成为引领农村全面进步的新风尚。科技作为推动农村发展的强大引擎&#xff0c;正在深刻改变着传统农业的生产方式、农村的社会结构以及农民的生活方式&#xff0c;为农村经济社会的全面进步注入了新的活力和动力。本文将从数字乡村…

JVM—内存可见性

什么是可见性 可见性&#xff1a;一个线程对共享变量值的修改,能够及时地被其他线程看到共享变量&#xff1a;如果一个变量在多个线程的工作内存中都存在副本,那么这个变量就是这几个线程的共享变量 Java内存模型(JMM) Java内存模型(Java Memory Model)描述了Java程序中各种…

【Java前端技术栈】Vue2、Vue Cli、Axio入门

一、基本介绍 1.Vue 是什么? Vue (读音 /vjuː/&#xff0c;类似于 view) 是一个前端框架, 易于构建用户界面 2. Vue 的核心库只关注视图层&#xff0c;不仅易于上手&#xff0c;还便于与第三方库或项目整合 3. 支持和其它类库结合使用 4. 开发复杂的单页应用非常方便 5.…

[Rust] 使用vscode实现HelloWorld程序并进行debug

一、简介 本文介绍了如何使用vscode编写rust&#xff0c;实现打印"Hello, world!"的程序。 二、工具安装 0. 环境介绍&#xff1a; Linux &#xff08;或者windowswsl&#xff09; 1. 安装rust编译器rustc和包管理器cargo。 请参考连接&#xff1a;Rust 程序设…

Android iOS客户端自动化UI自动化airtest从0到1搭建macos

一、基础环境 1. 安装jdk 选择jdk8 如果下载高版本 可能不匹配会失败 下载.dmg文件 苹果电脑 &#xff5c; macOS &#xff5c; jdk1.8 &#xff5c; 环境变量配置_jdk1.8 mac-CSDN博客 Java Downloads | Oracle jdk环境变量配置 找到java home qamac ~ % cd /Library/J…

K8s+Nacos实现应用的优雅上下线【生产实践】

文章目录 前言一、环境描述二、模拟请求报错三、配置优雅上下线1.修改nacos配置2.修改depolyment配置3.重新apply deployment后测试4.整体(下单)测试流程验证是否生效 四、期间遇到的问题 前言 我们在使用k8s部署应用的时候&#xff0c;虽然k8s是使用滚动升级的&#xff0c;先…

selenium自动化登录模块HTMLTestRunner测试报告

1.下载HTMLTestRunner.py放到python的Lib目录下&#xff0c;python3之后的&#xff0c;文件要修改以下内容&#xff1a; 第94行&#xff0c;将import StringIO修改成import io 第539行&#xff0c;将self.outputBuffer StringIO.StringIO()修改成self.outputBuffer io.Strin…

【微服务】微服务架构的最佳实践总结!

目录 推荐超级课程: Docker快速入门到精通Kubernetes入门到大师通关课AWS云服务快速入门实战构建和管理微服务是一项艰巨的任务。这是因为微服务就像多个并行的整体应用程序,它们都必须处于同步通信和并发运行时间。因此,在设计和构建它们时考虑并应用最佳实践非常重要。以下…

C++ —— 日期计算器

1. 头文件 #pragma once #include <iostream> using namespace std;class Date { public:Date(int year 1, int month 1, int day 1);int GetMonthDay();bool operator>(const Date& d) const;bool operator>(const Date& d)const;bool operator<(c…

GPU算力池管理工具Determined AI部署与使用教程(2024.03)

1. 概念 1.1 什么是Determined&#xff1f; Determined AI 是一个全功能的深度学习平台&#xff0c;兼容 PyTorch 和 TensorFlow。它主要负责以下几个方面&#xff1a; 分布式训练&#xff1a;Determined AI 可以将训练工作负载分布在多个 GPU&#xff08;可能在多台计算机上…

鸿蒙预览报错 Only files in a module can be previewed

HarmonyOS第一课下载的源码无法运行&#xff0c;也无法预览&#xff0c;报错如题。 解决&#xff1a; 1、在预览页如“index.ets”文件下预览。 2、如果在通知栏看到如图提示&#xff0c;可看出是ohos/hvigor-ohos-plugin插件版本的问题&#xff0c;可点击蓝色解决方案同步并导…

python 函数(解包**、互相调用、作用域、函数的封装、内置函数:eval()、zip()、文件处理open())

函数解包 """ 1、函数的注释&#xff1a;参数和返回值 在注释里可以自动添加显示&#xff0c;只需手动加说明。2、函数的解包【拆包】&#xff1a;函数的参数要传递数据有多个值的时候&#xff0c;中间步骤拿到数据 保存在元组或者列表 或者字典里。 - 传递参数…

活用 C语言之union的精妙之用

一、union的基本定义 Union的中文叫法又被称为共用体、联合或者联合体。它的定义方式与结构体相同,但意义却与结构体完全不同。下面是union的定义格式: union 共用体名 {成员列表}共用体变量名;它与结构体的定义方式相同,但区别在于共用体中的成员的起始地址都是相同的,…

【理解机器学习算法】之Clustering算法(DBSCAN)

DBSCAN&#xff08;基于密度的空间聚类应用噪声&#xff09;是数据挖掘和机器学习中一个流行的聚类算法。与K-Means这样的划分方法不同&#xff0c;DBSCAN特别擅长于识别数据集中各种形状和大小的聚类&#xff0c;包括存在噪声和离群点的情况。 以下是DBSCAN工作原理的概述&am…

KubeSphere的基本使用操作

KubeSphere的基本使用操作 基本使用用户角色创建企业空间创建项目 创建应用创建密钥创建MySQL密钥创建WordPress密钥 创建存储卷创建MySQL存储卷创建Wordpress存储卷 添加组件服务类型添加MySQL组件添加WordPress组件 访问Wordpress 基本使用 用户角色 KubeSphere 中的权限控制…

FloodFill算法——岛屿数量

文章目录 题目解析算法解析代码解析 题目解析 岛屿数量 题目依旧是熟悉的配方&#xff0c;熟悉的味道&#xff0c;还是那个0还是那个1还是那个二维矩阵&#xff0c;这时候BFS和DFS闻着味就来了&#xff0c;我们来看一下这个题目&#xff0c;这个题目也很容易理解如下图有一个…

【每日一问】IOS手机上Charles证书过期怎么办?

1、如何查看证书是否过期? 设置>通用>VPN与设备管理 2、在Charles中重置证书 步骤1&#xff1a;重置证书 Help>SSL Proxying>Reset Charles Root Certificate… 步骤2&#xff1a;在浏览器中&#xff0c;下载证书 首先&#xff0c;手机连上代理&#xff0c;然…