查找通过从C ++中的字符串中删除或改组字符形成的最长回文

概念

对于给定的字符串,确定可以通过从字符串中删除或改组字符来形成的最长回文。最后,如果已经观察到有多个最长的回文字符串,则仅返回一个回文。

输入值

pqr

输出结果

p OR q OR r

输入值

ppqqrr

输出结果

pqrrqp OR qprrpq OR rqppqr OR

any other palindromic字符串 of length 6.

输入值

pqp

输出结果

pqp

方法

在这里,我们可以将任何回文字符串分成三部分-乞求,中间和结尾。对于奇数长度的回文字符串,例如2n + 1,此处“ beg”由字符串的前n个字符组成,“ mid”仅由1字符组成,表示第(n + 1)个字符,“ end”由后n个字符组成回文字符串的字符。对于长度为2n的回文串,“ mid”中始终为空。我们已经知道,关于字符串是回文的顺序,“结束”将与“乞求”相反。现在,在我们的解决方案中,将实现上述观察。因为允许对字符进行改组,所以输入字符串中的字符顺序无关紧要。现在,我们首先获得输入字符串中每个字符的频率。之后,所有在输入字符串中偶数出现(例如2n)的字符将成为输出字符串的一部分,因为我们可以轻松地在'beg'字符串中设置n个字符,在'end'字符串中设置其他n个字符(借助保留回文顺序)。对于出现奇数个字符(例如2n +1)的字符,在这里,我们用所有此类字符之一填充“ mid”,其余2n个字符分成两半,并在开头和结尾添加。

示例

// C++ program to find the longest palindrome by removing

//或从给定的字符串中改组字符

#include <bits/stdc++.h>

using namespace std;

//显示找到最长回文的功能

//或从给定的字符串中改组字符

string findLongestPalindrome(string str1){

   //表示将字符的频率存储在字符串中

   int count1[256] = { 0 };

   //确定输入字符串中的字符频率

   for (int i = 0; i < str1.size(); i++)

      count1[str1[i]]++;

   //显示任何由三部分组成的回文字符串

   //beg1 + mid1 + end1-

  字符串 beg1 = "", mid1 = "", end1 = "";

   //这里的解决方案假设只有小写字母是

   //存在于字符串中。我们可以轻松地扩展它

   //考虑任何字符集

   for (char ch1 = 'a'; ch1 <= 'z'; ch1++){

      //现在,如果当前字符频率是奇数

   if (count1[ch1] & 1){

      //这里mid1将只包含1字符。它

      //将被下一个字符覆盖

      //奇数频率

      mid1 = ch1;

      //这里递减字符频率来制作

      //甚至考虑当前字符

      //再次

      count1[ch1--]--;

   }

   //如果当前字符频率是偶数

   else{

      //现在,如果count为n(偶数),则按

      //n / 2个字符,请求字符串和其余字符

      //n / 2个字符将成为结尾的一部分

      //字符串

      for (int i = 0; i < count1[ch1]/2 ; i++)

         beg1.push_back(ch1);

      }

   }

   //此处结尾将为乞求的反向

   end1 = beg1;

   reverse(end1.begin(), end1.end());

   // Now return palindrome字符串

   returnbeg1 + mid1 + end1-;

}

//驱动程式码

int main(){

  字符串 str1 = "pqqprrs";

   cout << findLongestPalindrome(str1);

   return 0;

}

输出结果

pqrsrqp

以上是 查找通过从C ++中的字符串中删除或改组字符形成的最长回文 的全部内容, 来源链接: utcz.com/z/350263.html

回到顶部