最长的子序列,其字符与子串相同,并且频率差最多为K

最长的子序列,其字符与子串相同,并且频率差最多为k

在这个问题中,我们会找到子序列的最大长度,使其包含连续的字符,并且所有字符的频率差不会超过K。

我们需要找到给定字符串的所有可能的子序列,并检查它是否连续包含每个字符以及最大频率差以获得输出。

问题陈述– 我们给出了一个包含小写字母字符的字符串 alpha。另外,我们已经给出了正整数 K。我们需要找到给定字符串的子序列的最大长度,使其遵循以下规则。

特定字符的所有出现都应该是连续的。

字符出现频率的差值不能大于K。

示例

输入

alpha = "ppppqrs", K = 2

输出

6

解释 – 我们可以采用“pppqrs”子序列。最大字符频率为3,最小字符频率为1。因此,差值为2。并且它连续包含所有字符。

输入

alpha = "abbbbc", K = 2

输出

5

解释 – 我们可以采用“abbbc”子序列。

输入

alpha = "mnnnnnnno", k = 3;

输出

7

解释 – 我们可以采用“nnnnnnn”子序列。

方法 1

在这种方法中,我们将使用递归函数来查找给定长度的所有子序列。此外,我们将定义函数来检查子序列是否连续包含所有字符。我们将使用地图数据结构来计算最大和最小频率差异。

算法

第 1 步 – 定义“f”映射来存储字符的频率。

步骤 2 – 如果开始等于临时字符串的长度,并且字符串长度大于 0,请按照以下步骤操作。

第 3 步 – 初始化“minf”和“maxf”变量来存储最小和最大频率。

第 4 步– 清除地图,并将每个字符的出现频率存储在地图中。

第 5 步 – 遍历地图值并找到最大和最小频率值。

步骤6 – 如果最大和最小频率差小于或等于K,则检查字符串是否包含连续字符。

步骤 6.1 – 在 checkForContinously() 函数中,定义“pos”映射来存储特定字符的最后位置。

步骤 6.2 – 遍历字符串。如果地图中存在当前字符,并且该字符的当前位置与最后位置之间的差值小于1,则更新最后位置。否则,返回 false。

步骤 6.3 – 如果角色不存在,则将角色添加到地图。

步骤 6.4 – 最后返回 true。

步骤7 – 如果字符串包含连续字符,并且频率差小于K,如果’maxi’的值小于当前子序列的长度,则更新’maxi’的值。 p>

第 8 步 – 排除当前字符后进行递归调用。

步骤 9 – 将当前字符附加到临时字符串的末尾。另外,使用更新后的“tmp”字符串进行递归调用。

示例

#include using namespace std;int maxi = 0;// Check for continuous characters in the substringbool CheckForContinuous(string &tmp) {    // map to store the last index of the character    unordered_map pos;    for (int p = 0; p < tmp.length(); p++) {        // When the last index exists in the map        if (pos[tmp[p]]) {            // If the last index is adjacent to the current index            if (p - pos[tmp[p]] + 1 <= 1)                pos[tmp[p]] = p + 1;            else                return false;        } else {            // When the map doesn't have a character as a key            pos[tmp[p]] = p + 1;        }    }    return true;}void getLongestSubSeq(string &alpha, string tmp, int start, int &k) {    // To store the character's frequency    unordered_map f;    if (start == alpha.length()) {        if (tmp.length() > 0) {            // To store minimum and maximum frequency of characters            int minf = INT_MAX, maxf = INT_MIN;            // Make map empty            f.clear();            // Store frequency of characters in the map            for (int p = 0; p < tmp.length(); p++)                f[tmp[p]]++;            // Get minimum and maximum value from the map            for (auto &key : f) {                minf = min(minf, key.second);                maxf = max(maxf, key.second);            }            // Validate substring for frequency difference and continuous characters            if (maxf - minf <= k && CheckForContinuous(tmp))                maxi = max(maxi, (int)tmp.length());        }        return;    }    // Exclude current character    getLongestSubSeq(alpha, tmp, start + 1, k);    // Include current character    tmp.push_back(alpha[start]);    getLongestSubSeq(alpha, tmp, start + 1, k);}int main() {    string alpha = "ppppqrs", tmp;    int k = 2;    getLongestSubSeq(alpha, tmp, 0, k);    cout <<"The maximum length of the substring according to the given conditions is " << maxi;    return 0;}

输出

The maximum length of the substring according to the given conditions is 6

时间复杂度 – O(N*2N),其中 O(N) 用于检查连续字符,O(2N) 用于查找所有子序列。

空间复杂度 – O(N) 来存储临时子序列。

我们使用简单的方法来查找给定字符串的所有子序列。然而,这是非常耗时的。不建议对大字符串使用此方法来解决问题。

以上就是最长的子序列,其字符与子串相同,并且频率差最多为K的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1444716.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月17日 21:49:08
下一篇 2025年12月16日 06:24:29

相关推荐

  • 检查每个单词的字符是否可以重新排列以形成等差数列(AP)

    在本文中,我们将讨论如何检查给定字符串中每个单词的字符是否可以重新排列以形成等差数列(AP)。我们还将使用C++实现解决方案,并提供一个示例来说明代码的工作原理。 等差数列(AP) 等差数列(AP)是一组数字的序列,其中每个项都是通过将常数d添加到前一项来获得的。常数d被称为公差。 例如,序列 1,…

    2025年12月17日
    000
  • 按字符的ASCII值对字符串进行排序

    ASCII 值 ASCII(美国信息交换标准代码)是计算机和互联网上文​​本数据最常见的字符编码格式。在标准 ASCII 编码数据中,256 个字母、数字或特殊附加字符和控制代码都有唯一值。 问题陈述 现在,在这个问题中,我们需要根据字符的 ASCII 值按升序找到排序后的字符串,其中该字符串将是用…

    2025年12月17日
    000
  • 计算要与频率大于其他字符频率之和的字符连接的字符串数量

    我们的主要目标是确定最多的字符串能够被连接起来,以确保只有一个字母的频率超过所有其他字符的总和,前提是有一个名为arr[]的包含M个字符串的数组。 在继续之前,让我们了解一些数组和字符串的基本概念。 数组就是一组相同数据类型的元素,存储在连续的内存区域中。 C编程语言中的数组具有固定的大小,这意味着…

    2025年12月17日
    000
  • 链表中出现次数最多的字符

    我们给定了一个字符单链表,我们的任务是打印链表中出现次数最多的字符。如果多个字符出现的次数相同,则打印最后出现的字符。 单链表是一种由节点组成的线性数据结构。每个节点都包含数据和指向下一个节点的指针,该指针包含下一个节点的内存地址,因为分配给每个节点的内存不是连续的。 示例 假设我们已经给出了一个字…

    2025年12月17日
    000
  • 数组元素的频率是否为质数?

    Suppose we have one array. we have to count how many of the elements present in the array prime number of times. So if the array is {1, 2, 2, 0, 1, 5,…

    2025年12月17日
    000
  • putchar函数可以向终端输出一个字符么

    putchar函数可以向终端输出一个字符。putchar函数是C库函数,它可以把参数char指定的字符写入到标准输出中。putchar函数声明:【int putchar(int char)】,其中,参数char就是要被写入的字符。 putchar函数可以向终端输出一个字符,它是c语言函数之一。 (推…

    2025年12月17日
    000
  • 输入一个字符,如何判断是字母,数字还是特殊字符

    输入一个字符,如何判断是字母,数字还是特殊字符 方法如下: 1、使用格式符%c获得输入的字符; 2、判断该字符在ascii码表中的位置即可。 #include int main(){ char ch; printf(“请输入一个字符”); scanf(“%c”,&ch); if(ch &gt…

    2025年12月17日
    000
  • Flutter应用中通过PHP API安全获取MySQL插入ID的实现指南

    本教程详细介绍了如何在flutter应用中,通过php api安全地获取mysql数据库插入操作后生成的自增id。我们将重点讲解php后端如何使用预处理语句防止sql注入,并利用`insert_id`获取id,然后将其封装为json响应返回。前端flutter应用则负责解析该json,从而获取并利用…

    2025年12月12日
    000
  • PHP中正确解析JSON字符串数组:避免双重编码陷阱

    本教程旨在解决PHP中`json_decode()`函数在处理前端发送的JSON字符串数组时常见的误解,特别是当数据似乎被“双重编码”成一个字符串时。文章将深入探讨`json_decode()`的正确用法,区分JSON数组字符串和包含JSON数组的字符串,并提供清晰的代码示例,帮助开发者确保后端能够…

    2025年12月12日
    000
  • PHP中通过cURL获取需要认证的远程文件内容

    当PHP需要从受认证保护的远程服务器获取文件内容时,内置的file_get_contents函数无法直接处理认证机制。本文将详细介绍如何利用PHP的cURL扩展来安全、高效地实现这一目标,涵盖基本的HTTP认证方法,以及如何解析获取到的XML数据,并探讨更复杂的认证场景,确保开发者能够灵活应对各种远…

    2025年12月10日
    000
  • MySQL字符串截取 和 截取字符进行查询

    通过mysql自带的一些字符串截取函数,对数据进行处理,下面是我整理的字符串截取 和 截取字符进行查询。 一、MySQL中字符串的截取 MySQL中有专门的字符串截取函数:其中常用的有两种:substring_index(str,delim,count) 和concat 1.substring_in…

    2025年12月2日
    000
  • 生成准确表达文章主题的标题 SQL查询中动态构建带引号别名的技巧与最佳实践

    在编程语言中动态构建SQL查询时,处理字符串内部的引号是一个常见挑战。本文将探讨当需要在SQL查询中使用带引号的列别名(例如数字作为别名)时,如何避免语法错误。我们将介绍两种主要解决方案:通过转义字符嵌入引号,以及采用符合SQL规范的非引用标识符作为别名,并强调后者的最佳实践。 在许多编程场景中,特…

    2025年11月25日 java
    000
  • 为什么SublimeText的快捷键冲突了?解决快捷键冲突的实用教程

    解决快捷键冲突的核心是利用用户自定义配置覆盖默认或插件快捷键。通过 Preferences → Key Bindings 查看左右两侧的默认与用户配置,使用搜索功能定位快捷键或命令,在右侧用户文件中添加或修改键绑定规则,优先级最高。可用 sublime.log_commands(True) 查看实际…

    2025年11月9日 开发工具
    100
  • 让 iPhone 崩溃重启,只需输入这个字符 .

    在 ios 系统中,偶尔会出现一些奇怪的文本字符串漏洞,这些漏洞只需几个字符就能导致你的 iphone 崩溃。本周,一位安全研究员在 mastodon 上发现了一个新的漏洞,当你在 spotlight 搜索或 app 资源库中输入以下字符时,会导致你的 iphone 崩溃:”&#8221…

    2025年11月8日 硬件教程
    300
  • MySQL中关于浮点型转换成字符型出现的一些问题解决

    类型转换是我们日常开发中经常会遇到的一个需求,最近在将浮点型转换成字符型的时候就遇到了一个问题,所以总结分享出来,下面这篇文章主要给大家介绍了mysql中关于浮点型转字符型可能遇到的问题的相关资料,需要的朋友可以参考下。 前言 本文主要给大家介绍了MySQL中在将浮点型转字符型的时候遇到的一个问题,…

    2025年11月6日 数据库
    100

发表回复

登录后才能评论
关注微信