查找通过从C ++中的字符串中删除或改组字符形成的最长回文
概念
对于给定的字符串,确定可以通过从字符串中删除或改组字符来形成的最长回文。最后,如果已经观察到有多个最长的回文字符串,则仅返回一个回文。
输入值
pqr
输出结果
p OR q OR r
输入值
ppqqrr
输出结果
pqrrqp OR qprrpq OR rqppqr ORany 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