แนวคิด
สำหรับสตริงที่กำหนด ให้กำหนดพาลินโดรมที่ยาวที่สุดที่สามารถเกิดขึ้นได้โดยการเอาหรือสับเปลี่ยนอักขระออกจากสตริง ในที่สุดก็ส่งคืน palindrome เพียงอันเดียวหากพบว่ามีสตริง palindrome ที่ยาวที่สุดหลายอัน
อินพุต
pqr
ผลลัพธ์
p OR q OR r
อินพุต
ppqqrr
ผลลัพธ์
pqrrqp OR qprrpq OR rqppqr OR any other palindromic string of length 6.
อินพุต
pqp
ผลลัพธ์
pqp
วิธีการ
ที่นี่ เราสามารถแบ่งสตริงพาลินโดรมใดๆ ออกเป็นสามส่วน - ขอ กลาง และท้าย ด้วยความเคารพของสตริงพาลินโดรมที่มีความยาวคี่พูดว่า 2n + 1 ที่นี่ 'ขอ' ประกอบด้วยอักขระ n ตัวแรกของสตริง 'กลาง' ประกอบด้วยอักขระ 1 ตัวเท่านั้นที่หมายถึง (n + 1) อักขระที่และ 'สิ้นสุด' ประกอบด้วย n อักขระสุดท้าย สตริงพาลินโดรม สำหรับสตริงพาลินโดรมที่มีความยาวเท่ากัน 2n จะมีช่องว่างใน 'กลาง' เสมอ เรารู้อยู่แล้วว่า 'สิ้นสุด' จะกลับกันจาก 'ขอ' ในแง่ของคำสั่งให้สตริงเป็นพาลินโดรม ตอนนี้ แนวคิดคือการนำการสังเกตข้างต้นไปใช้ในโซลูชันของเรา เนื่องจากอนุญาตให้สับเปลี่ยนอักขระได้ จึงไม่ต้องมีลำดับของอักขระในสตริงอินพุต ขั้นแรก เราได้รับความถี่ของอักขระแต่ละตัวในสตริงอินพุต หลังจากนั้นอักขระทั้งหมดที่มีแม้กระทั่ง (พูด 2n) ในสตริงอินพุตจะเป็นส่วนหนึ่งของสตริงเอาต์พุตเพราะเราสามารถตั้งค่าอักขระ n ตัวในสตริง 'ขอ' และอักขระ n ตัวอื่น ๆ ในสตริง 'สิ้นสุด' (ด้วยความช่วยเหลือของการรักษา ลำดับพาลินโดรม) สำหรับอักขระที่มีเหตุการณ์แปลก ๆ (เช่น 2n + 1) ในที่นี้ เราเติม "กลาง" ด้วยอักขระดังกล่าวทั้งหมด และอักขระ 2n ที่เหลือจะถูกแบ่งครึ่งและเพิ่มเมื่อเริ่มต้นและสิ้นสุด
ตัวอย่าง
// C++ program to find the longest palindrome by removing
// or shuffling characters from the given string
#include <bits/stdc++.h>
using namespace std;
// Shows function to find the longest palindrome by removing
// or shuffling characters from the given string
string findLongestPalindrome(string str1){
// Indicated to stores freq of characters in a string
int count1[256] = { 0 };
// Determine freq of characters in the input string
for (int i = 0; i < str1.size(); i++)
count1[str1[i]]++;
// Shows any palindromic string consisting of three parts
// beg1 + mid1 + end1
string beg1 = "", mid1 = "", end1 = "";
//Here solution assumes only lowercase characters are
// present in string. We can easily extend this
// to consider any set of characters
for (char ch1 = 'a'; ch1 <= 'z'; ch1++){
// Now if the current character freq is odd
if (count1[ch1] & 1){
// Here mid1 will contain only 1 character. It
// will be overridden with next character
// with odd freq
mid1 = ch1;
// Here decrement the character freq to make
// it even and consider current character
// again
count1[ch1--]--;
}
// Here if the current character freq is even
else{
// Now if count is n(an even number), push
// n/2 characters to beg string and rest
// n/2 characters will form part of end
// string
for (int i = 0; i < count1[ch1]/2 ; i++)
beg1.push_back(ch1);
}
}
// Here end will be reverse of beg
end1 = beg1;
reverse(end1.begin(), end1.end());
// Now return palindrome string
return beg1 + mid1 + end1;
}
// Driver code
int main(){
string str1 = "pqqprrs";
cout << findLongestPalindrome(str1);
return 0;
} ผลลัพธ์
pqrsrqp