C++程序:找到具有相同左右旋转的数字的最长子序列

c++程序:找到具有相同左右旋转的数字的最长子序列

在这个问题中,我们需要找到左右旋转相同的子序列的最大长度。左旋转是指将字符串中的所有字符向左移动,并将末尾的第一个字符移动。右旋转意味着将所有字符串字符向右移动,并将最后一个字符移动到开头。

问题陈述 – 我们给定了包含数字的字符串str,需要找到左右旋转相同的最大长度的子序列。

示例

输入-str =“323232”,

输出– 6

立即学习“C++免费学习笔记(深入)”;

解释 – 左右旋转相同的最长子序列是“323232”。左旋转为‘232323’,右旋转为‘232323’。

输入-str = ‘00010100’

输出– 6

立即学习“C++免费学习笔记(深入)”;

说明 – 左右旋转相同的最长子序列是“000000”。

输入-str = ‘092312110431010’

输出– 6

立即学习“C++免费学习笔记(深入)”;

解释 – 有 2 个可能的长度为 6 且左右旋转相同的子序列。第一个是“010101”,第二个是“101010”。

方法 1

在这种方法中,我们将找到给定字符串的所有可能的子序列。之后,我们将检查字符串的左右旋转是否相同。我们将使用递归方法来查找所有可能的子序列。

算法

将“maxLen”全局变量初始化为零,以存储左右旋转相同的最长子序列的长度。

定义 isRightSameLeft() 函数来检查字符串左右旋转是否相同。

在函数内部,使用 substr() 方法左右旋转字符串。

getAllSubSeq() 函数用于查找给定字符串的所有可能的子序列。

定义基本情况。如果str为空,我们获取子序列并执行isRightSameLeft()函数来检查子序列是否具有相同的左右旋转。如果是,如果“maxLen”变量的长度大于“maxLen”的当前值,则更新“maxLen”变量的值。

从“str”中删除第一个字符并附加“out”字符串后进行递归调用。

删除第一个字符并保持“out”字符串不变后,再次进行递归函数调用。在此递归调用中,我们排除“str”的第一个字符。

示例

#include #include using namespace std;// Defining global variable to store the length of the longest subsequence according to the given conditionint maxLen = 0;//  function to check if the string is the same after the left rotationbool isRightSameLeft(string str) {   int len = str.length();   return str.substr(1, len - 1) + str[0] == str[len - 1] + str.substr(0, len - 1);}// function to get all subsequences of a stringvoid getAllSubSeqs(string str, string out) {   // If the string is empty, we get the subsequences. Check if its left and right rotation is the same   if (str.empty()) {      if (isRightSameLeft(out))          maxLen = max(maxLen, (int)out.length());      return;   }   // Recursive case remove the first character from str, and add it to the output   getAllSubSeqs(str.substr(1), out + str[0]);   // remove the first character from str, and drop it   if (str.length() > 1)      getAllSubSeqs(str.substr(1), out);}int main() {   string str = "323232";   string out = "";   getAllSubSeqs(str, out);   cout << "The longest subsequence of str having same left and right rotation is " << maxLen;   return 0;}

输出

The longest subsequence of str having same left and right rotation is 6

时间复杂度 – O(N*2N)。这里 O(N) 用于比较左右旋转,O(2N) 用于查找所有可能的子序列。

空间复杂度 – O(1),因为我们不使用额外的空间。

方法2

这里,我们对上面的方法进行了优化。我们可以观察样本输入的解决方案。仅当子序列包含相同字符或交替包含两个不同字符且长度为偶数时,子序列的左右旋转才相同。

算法

使用两个嵌套循环来组合任意两个数字。

定义‘cnt’变量来查找交替包含两个数字的子序列的长度,并初始化为零。

定义布尔类型的“first”变量来跟踪下一个字符应该是第i个还是第j个。

使用循环遍历字符串。

如果first == true且str[k] – ‘0’ == I,则交替’first’的值并将’cnt’增加1。

如果first == false且str[k] – ‘0’== j,则再次交替’first’的值并将’cnt’增加1。

如果 i 和 j 不相等,且“cnt”值为奇数,则将其减 1。

如果 cnt 值大于“res”,则更新“res”变量的值。

示例

#include using namespace std;int getLongSubSeq(string str) {   // Store the length of the string   int len = str.size(), res = 0;   // Traverse the all possible combination of two digits   for (int i = 0; i < 10; i++) {      for (int j = 0; j < 10; j++) {          // to store the length of an alternating sequence of the current combination          int cnt = 0;          // to track the turn of the ith or jth digit          bool first = true;          // traverse the string          for (int k = 0; k < len; k++) {              // If the current digit is equal to I, and the first is true, increment the count              if (first == true and str[k] - '0' == i) {                  first = false;                  cnt++;              } else if (first == false and str[k] - '0' == j) {                  // If the current digit is equal to j, and the first is false, increment the count                  first = true;                  cnt++;              }          }          // If the sequence is odd and i and j are different, decrement the count          if (i != j and cnt % 2 == 1)              cnt--;          // Update the answer          res = max(cnt, res);       }   }   return res;}int main() {   string str = "00010100";   cout << "The longest subsequence of str having same left and right rotation is " << getLongSubSeq(str);   return 0;}

输出

The longest subsequence of str having same left and right rotation is 6

时间复杂度 – O(10*10*N),因为我们从包含数字组合的字符串中找到子序列。

空间复杂度 – O(1),因为我们不使用动态空间。

本教程教给我们两种方法来查找包含相同左右旋转的最长子序列。第一种方法是简单的方法,这种方法非常耗时,而且我们不能将其用于大量输入。

第二种方法经过优化,其时间复杂度几乎等于 O(N)。

以上就是C++程序:找到具有相同左右旋转的数字的最长子序列的详细内容,更多请关注创想鸟其它相关文章!

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

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月17日 21:00:44
下一篇 2025年12月15日 04:08:28

相关推荐

  • 将一个以链表表示的数字加1

    数字的链表表示是这样提供的:链表的所有节点都被视为数字的一位数字。节点存储数字,使得链表的第一个元素保存数字的最高有效位,链表的最后一个元素保存数字的最低有效位。例如,数字 202345 在链表中表示为 (2->0->2->3->4->5)。 要向这个表示数字的链表添加…

    2025年12月17日
    000
  • 检查一个数字是否为回文的Bash程序?

    要检查一个数字是否是回文数,我们需要将该数字反转,然后如果原始数字和反转后的数字相同,则为回文数。在Bash中,执行反转操作非常简单。我们需要使用‘rev’命令来实现。让我们看一下程序以更清楚地理解。 示例 #!/bin/bash# GNU bash Scriptn=12321rev=$(echo …

    2025年12月17日
    000
  • 将数组表示的数字加1(递归方法)

    给定一个数组,该数组是由非负数字表示的数字的集合,将数字加1(增加由数字表示的数字)。数字存储方式是最高位数字是数组的第一个元素。 要将数字加1到由数字表示的数字 从数组末尾开始,加法意味着将最后一个数字4舍入为5。 如果最后一个元素是9,则将其变为0并进位=1。 对于下一次迭代,检查进位,如果加到…

    2025年12月17日
    000
  • 打印N行数字,使得每对数字之间的最大公约数为K

    gcd gcd代表两个或多个整数的最大公约数,不包括0 例如,要找到48和180的最大公约数 48 = 2 × 2 × 2 × 2 × 3 180 = 2 × 2 × 3 × 3 × 5 最大公约数 = 2 × 2 × 3 = 12。 在给定的问题中,应打印N行,其中元素具有指定的最大公约数 Inp…

    2025年12月17日
    000
  • 在C语言中,不使用循环、递归和宏展开的情况下,打印一个数字100次

    在本节中,我们将看到如何在C语言中打印一个数字100次。有一些限制条件。我们不能使用循环、递归或宏展开。 为了解决这个问题,我们将使用C语言中的setjump和longjump。setjump()和longjump()位于setjmp.h库中。这两个函数的语法如下所示。 示例 #include #i…

    2025年12月17日
    000
  • C程序以X形式显示数字

    参考下面的算法,编写C程序以显示X形状的数字。 算法 Step 1: StartStep 2: Declare variablesStep 3: Read number of rowsStep 4: for loop satisfiesif(i==j || i+j==rows-1)print i+1…

    2025年12月17日
    000
  • C++程序以找到使数字为0所需的最少操作次数

    假设我们有一个包含 n 位数字的数字字符串 S。假设 S 代表一个数字时钟,整个字符串显示从 0 到 10^n – 1 的整数。如果位数较少,则会显示前导 0。按照以下操作 – 将时钟上的数字减 1,或 交换两位数字 p> 我们希望时钟能够以最少的操作次数显示 0。我们…

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

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

    2025年12月17日
    000
  • C# 判断字符串是否可以转化为数字

    c#  判断字符串是否可以转化为数字  /// /// 判断字符串是否可以转化为数字 /// /// 要检查的字符串 /// true:可以转换为数字;false:不是数字 public static bool IsNumberic(string str) { double vsNum; bool …

    好文分享 2025年12月17日
    000
  • python如何判断一个字符串是否全是数字_python isdigit()等方法判断字符串是否为纯数字

    判断字符串是否为纯数字可通过isdigit()、isnumeric()、isdecimal()和正则表达式实现;其中isdigit()适用于ASCII数字,isnumeric()支持更广的数字类型,isdecimal()仅限十进制,正则^d+$可灵活匹配但性能较低;含符号或小数可用float()转换…

    2025年12月14日
    000
  • Python程序找到第一个和最后一个数字的和

    在本文中,给定的任务是将整数的第一个数字和最后一个数字相加。现在整数可以非常小,也可以很大。因此,这些计划将分为两部分。首先,我们需要找到这个整数有多大,然后从中得到第一个数字。第二部分是从给定的整数中获取最后一个数字,这可以通过将数字除以十并找到余数来轻松完成。在这篇 Python 文章中,使用四…

    2025年12月13日
    000
  • 币圈免费行情查询网站推荐_最新免费数字货币行情网站大全

    对于数字货币投资者而言,实时、准确的行情数据是做出明智决策的关键。本文精选了市场上广受好评的免费行情查询网站,它们不仅提供基础的价格信息,还集成了强大的图表工具和市场分析功能,帮助您轻松掌握市场动态。 1. 币安 (Binance) 作为全球领先的数字资产交易所,币安不仅提供交易服务,其行情页面本身…

    2025年12月11日
    000
  • 币圈交易中,如何区分有效的K线突破和“假突破”?

    有效突破需量价、K线、时间与指标四维验证:放量突破关键位且成交量达前5日均量1.5倍以上,K线实体强劲覆盖前一根70%以上,无长影线干扰;突破后价格回踩原阻力位不破,伴随缩量;MACD金叉、RSI处于50-70健康区间、OBV创阶段性新高,多重信号共振方可确认突破有效性。 2026主流数字货币交易所…

    2025年12月11日
    000
  • 什么是“灰度比特币信托”(GBTC)?它如何为传统投资者提供比特币敞口?

    GBTC是全球首个合规比特币投资工具,通过股票形式让传统投资者间接持有比特币。作为封闭式信托,它由Grayscale运营,将投资者资金集中购买比特币并由第三方托管,投资者获发可在OTC市场交易的股票。为保障合规,GBTC自2020年起注册为SEC报告公司,定期披露持仓与财务信息,并由Coinbase…

    2025年12月11日
    100
  • 什么是USDC(美元硬币)?USDC如何运作、利弊及未来

    USDC(美元硬币)作为一种备受关注的加密资产,它将美元的稳定价值与区块链技术的去中心化和透明性相结合。USDC是一种由中心化实体发行的抵押型稳定币,旨在1:1锚定美元价值,即1个USDC始终等于1美元。这种锚定机制通过储备金来支撑,发行方会持有等值的美元或其他高流动性资产作为抵押,并定期接受审计以…

    2025年12月11日
    000
  • 加密货币投资教学:币圈新手必看七步骤入门指南!

    对于初入币圈的新手来说,面对琳琅满目的数字资产和复杂的交易机制,往往感到无从下手。本指南旨在为新手投资者提供一个清晰、分步的入门流程,帮助大家理解加密货币投资的基础知识,掌握必要的交易技能,并有效规避潜在风险,从而在数字资产的世界中稳健前行。从选择合适的交易平台到制定投资策略,每一步都至关重要,为您…

    2025年12月11日
    000
  • 比特币(BTC)分析师深度分析:第九次看涨RSI信号触发后或将迎来35%暴涨行情

    目录 关键要点:市场对比特币的长期前景存在分歧比特币在哪里购买交易?1、币安Binance2、欧易OKX3、火币 htx Huobi4、Bitget5、Gate.io大门6、百币bybit7、Coinbase Pro8、Kraken9、KuCoin10、BitMEX国内购买比特币操作步骤教程怎么用微…

    2025年12月11日 好文分享
    000
  • 冷存储/热存储:安全性与便捷性的选择

    在数字货币的世界中,资产的存储方式是用户最为关心的问题之一。冷存储与热存储,这两种截然不同的存储模式,各自拥有其独特的优缺点,关乎着资金的安全性与日常操作的便捷性。理解这两种存储方式的内在机制,对于任何希望在加密领域安全航行的投资者来说都至关重要。本文将深入探讨冷存储与热存储的原理、应用场景以及如何…

    好文分享 2025年12月11日
    000
  • 加密货币“减半”是什么?为何会影响价格?

    加密货币“减半”是一个内置于某些加密货币(如比特币)协议中的预定事件。这个过程直接关系到新币的创建速度和矿工的奖励机制,对整个加密货币生态系统产生着深远的影响。要理解减半,就需要先了解加密货币的发行方式。许多加密货币通过一个称为“挖”的过程来发行新的币。 2025主流数字货币交易所: 1、欧易OKX…

    2025年12月11日
    000
  • 什么是Gas费?如何计算和优化?

    Gas费是在区块链网络上执行交易或与智能合约交互时,用户需要支付给网络验证者(或矿工)的费用。这个概念在以太坊等支持智能合约的区块链上尤为核心。可以把它想象成在区块链这条高速公路上行驶时,你的车辆(交易)需要消耗的燃料(Gas)。 2025主流数字货币交易所: 1、欧易OKX 注册入口: APP下载…

    2025年12月11日
    000

发表回复

登录后才能评论
关注微信