Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

ค้นหา palindrome ที่ยาวที่สุดที่เกิดขึ้นจากการลบหรือสับเปลี่ยนตัวอักษรจากสตริงใน C++


แนวคิด

สำหรับสตริงที่กำหนด ให้กำหนดพาลินโดรมที่ยาวที่สุดที่สามารถเกิดขึ้นได้โดยการเอาหรือสับเปลี่ยนอักขระออกจากสตริง ในที่สุดก็ส่งคืน 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