在C++中重新排列字符串以最大化回文子串的数量


给定任意长度的字符串“str”。任务是重新排列字符,使其包含尽可能多的回文子串,无需添加或删除任何字符。回文串是指字符排列后从头到尾读音相同的字符串。

让我们看看各种输入输出场景:

输入 - 字符串 str = "itnin"

输出 - 重新排列字符串以最大化回文子串数量的结果是:iinnt。

解释 - 给定一个字符串变量str。我们将重新排列输入字符串的字符,使其成为最大回文串,如果不可能,则返回“不可能”。因此,给定输入字符串的输出是“iinnt”。

输入 - 字符串 str = "abaaaabb"

输出 - 重新排列字符串以最大化回文子串数量的结果是:aaaaabbb。

解释 - 给定一个字符串变量str。我们将重新排列输入字符串的字符,使其成为最大回文串,如果不可能,则返回“不可能”。因此,给定输入字符串的输出是“aaaaabbb”。

下面程序中使用的方法如下:

  • 输入一个字符串类型的变量,例如str,计算字符串的大小并将其存储在一个名为length的变量中。

  • 将数据传递给函数Rearr_string(str, length)。

  • 在函数Rearr_string(str, length)内部:

    • 声明一个大小为26的整型数组,例如arr[26],并将其初始化为0。

    • 声明一个名为temp的字符串类型临时变量。

    • 启动FOR循环,从i=0到i小于length。在循环内,设置arr[str[i] - 'a']++。

    • 启动FOR循环,从i=0到i小于26。在循环内,启动另一个FOR循环,从j=0到j小于arr[i]。在循环内,设置temp = temp + (char)(97 + i)。

    • 返回temp。

  • 打印结果。

示例

#include <bits/stdc++.h>
using namespace std;
string Rearr_string(string str, int length){
   int arr[26] = { 0 };
   string temp = "";
   for(int i = 0; i < length; i++){
      arr[str[i] - 'a']++;
   }
   for(int i = 0; i < 26; i++){
      for(int j = 0; j < arr[i]; j++){
         temp = temp + (char)(97 + i);
      }
   }
   return temp;
}
int main(){
   string str = "itinn";
   int length = str.length();
   cout<<"Rearrangement of the string to maximize the number of palindromic substrings is: "<<Rearr_string(str, length);
   return 0;
}

输出

如果运行以上代码,将生成以下输出:

Rearrangement of the string to maximize the number of palindromic substrings is: iinnt

更新于:2021年11月2日

232 次浏览

开启你的职业生涯

完成课程获得认证

开始学习
广告