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