0

0

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

PHPz

PHPz

发布时间:2023-08-30 13:33:11

|

891人浏览过

|

来源于tutorialspoint

转载

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() 函数用于查找给定字符串的所有可能的子序列。

    Replit Agent
    Replit Agent

    Replit最新推出的AI编程工具,可以帮助用户从零开始自动构建应用程序。

    下载
  • 定义基本情况。如果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 condition
int maxLen = 0;
//  function to check if the string is the same after the left rotation
bool 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 string
void 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)。

相关专题

更多
全局变量怎么定义
全局变量怎么定义

本专题整合了全局变量相关内容,阅读专题下面的文章了解更多详细内容。

78

2025.09.18

python 全局变量
python 全局变量

本专题整合了python中全局变量定义相关教程,阅读专题下面的文章了解更多详细内容。

96

2025.09.18

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

258

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

208

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1465

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

619

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

550

2024.03.22

php中定义字符串的方式
php中定义字符串的方式

php中定义字符串的方式:单引号;双引号;heredoc语法等等。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

545

2024.04.29

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

65

2026.01.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
CSS3 教程
CSS3 教程

共18课时 | 4.6万人学习

PostgreSQL 教程
PostgreSQL 教程

共48课时 | 7.4万人学习

Django 教程
Django 教程

共28课时 | 3.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号