查找通过从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