查找通过从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
猜你喜欢