Keresse meg a leghosszabb palindromot, amely karakterek eltávolításával vagy megkeverésével jött létre

Adott egy karakterlánc keresse meg a leghosszabb palindromot, amelyet karakterek eltávolításával vagy megkeverésével lehet létrehozni. Csak egy palindromot adjon vissza, ha több, a leghosszabb hosszúságú palindrom sztring van.

Példák: 

  Input:    abc   Output:   a OR b OR c   Input:    aabbcc   Output:   abccba OR baccab OR cbaabc OR any other palindromic string of length 6.   Input:    abbaccd   Output:   abcdcba OR ...   Input:    aba   Output:   aba 

Bármely palindromikus húrt három részre oszthatunk - a közepére és a végére. Páratlan hosszúságú palindrom karakterlánc esetén mondjuk a 2n + 1 „beg” a karakterlánc első n karakteréből áll a „mid” csak 1 karakterből áll, azaz az (n + 1) karakter, az „end” pedig a palindrom karakterlánc utolsó n karakteréből áll. Páros hosszúságú palindrom karakterlánc esetén a 'mid' mindig üres. Meg kell jegyezni, hogy az „end” a „beg” fordítottja lesz, hogy a karakterlánc palindrom legyen.

Az ötlet az, hogy a fenti megfigyelést használjuk megoldásunkban. Mivel a karakterek keverése megengedett, a karakterek sorrendje nem számít a beviteli karakterláncban. Először megkapjuk a bemeneti karakterlánc egyes karaktereinek gyakoriságát. Ekkor minden páros előfordulású karakter (mondjuk 2n) a bemeneti karakterláncban része lesz a kimeneti karakterláncnak, mivel könnyen elhelyezhetünk n karaktert a 'beg' karakterláncban, a többi n karaktert pedig az 'end' karakterláncban (a palindromikus sorrend megőrzésével). A páratlan előfordulású karaktereknél (mondjuk 2n + 1) a „középet” az összes ilyen karakter valamelyikével töltjük ki. és a fennmaradó 2n karaktert ketté kell osztani, és hozzáadni az elején és a végén.

Alább látható a fenti ötlet megvalósítása 

C++
   // C++ program to find the longest palindrome by removing   // or shuffling characters from the given string   #include          using     namespace     std  ;   // Function to find the longest palindrome by removing   // or shuffling characters from the given string   string     findLongestPalindrome  (  string     str  )   {      // to stores freq of characters in a string      int     count  [  256  ]     =     {     0     };      // find freq of characters in the input string      for     (  int     i     =     0  ;     i      <     str  .  size  ();     i  ++  )      count  [  str  [  i  ]]  ++  ;      // Any palindromic string consists of three parts      // beg + mid + end      string     beg     =     ''       mid     =     ''       end     =     ''  ;      // solution assumes only lowercase characters are      // present in string. We can easily extend this      // to consider any set of characters      for     (  char     ch     =     'a'  ;     ch      <=     'z'  ;     ch  ++  )      {      // if the current character freq is odd      if     (  count  [  ch  ]     &     1  )      {      // mid will contain only 1 character. It      // will be overridden with next character      // with odd freq      mid     =     ch  ;      // decrement the character freq to make      // it even and consider current character      // again      count  [  ch  --  ]  --  ;      }      // if the current character freq is even      else      {      // 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      <     count  [  ch  ]  /  2     ;     i  ++  )      beg  .  push_back  (  ch  );      }      }      // end will be reverse of beg      end     =     beg  ;      reverse  (  end  .  begin  ()     end  .  end  ());      // return palindrome string      return     beg     +     mid     +     end  ;   }   // Driver code   int     main  ()   {      string     str     =     'abbaccd'  ;      cout      < <     findLongestPalindrome  (  str  );      return     0  ;   }   
Java
   // Java program to find the longest palindrome by removing   // or shuffling characters from the given string   class   GFG     {   // Function to find the longest palindrome by removing   // or shuffling characters from the given string      static     String     findLongestPalindrome  (  String     str  )     {      // to stores freq of characters in a string      int     count  []     =     new     int  [  256  ]  ;      // find freq of characters in the input string      for     (  int     i     =     0  ;     i      <     str  .  length  ();     i  ++  )     {      count  [  str  .  charAt  (  i  )  ]++  ;      }      // Any palindromic string consists of three parts      // beg + mid + end      String     beg     =     ''       mid     =     ''       end     =     ''  ;      // solution assumes only lowercase characters are      // present in string. We can easily extend this      // to consider any set of characters      for     (  char     ch     =     'a'  ;     ch      <=     'z'  ;     ch  ++  )     {      // if the current character freq is odd      if     (  count  [  ch  ]     %     2     ==     1  )     {      // mid will contain only 1 character. It      // will be overridden with next character      // with odd freq      mid     =     String  .  valueOf  (  ch  );      // decrement the character freq to make      // it even and consider current character      // again      count  [  ch  --]--  ;      }     // if the current character freq is even      else     {      // 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      <     count  [  ch  ]     /     2  ;     i  ++  )     {      beg     +=     ch  ;      }      }      }      // end will be reverse of beg      end     =     beg  ;      end     =     reverse  (  end  );      // return palindrome string      return     beg     +     mid     +     end  ;      }      static     String     reverse  (  String     str  )     {      // convert String to character array       // by using toCharArray       String     ans     =     ''  ;      char  []     try1     =     str  .  toCharArray  ();      for     (  int     i     =     try1  .  length     -     1  ;     i     >=     0  ;     i  --  )     {      ans     +=     try1  [  i  ]  ;      }      return     ans  ;      }      // Driver code      public     static     void     main  (  String  []     args  )     {      String     str     =     'abbaccd'  ;      System  .  out  .  println  (  findLongestPalindrome  (  str  ));      }   }   // This code is contributed by PrinciRaj1992   
Python3
   # Python3 program to find the longest palindrome by removing   # or shuffling characters from the given string   # Function to find the longest palindrome by removing   # or shuffling characters from the given string   def   findLongestPalindrome  (  strr  ):   # to stores freq of characters in a string   count   =   [  0  ]  *  256   # find freq of characters in the input string   for   i   in   range  (  len  (  strr  )):   count  [  ord  (  strr  [  i  ])]   +=   1   # Any palindromic consists of three parts   # beg + mid + end   beg   =   ''   mid   =   ''   end   =   ''   # solution assumes only lowercase characters are   # present in string. We can easily extend this   # to consider any set of characters   ch   =   ord  (  'a'  )   while   ch    <=   ord  (  'z'  ):   # if the current character freq is odd   if   (  count  [  ch  ]   &   1  ):   # mid will contain only 1 character. It   # will be overridden with next character   # with odd freq   mid   =   ch   # decrement the character freq to make   # it even and consider current character   # again   count  [  ch  ]   -=   1   ch   -=   1   # if the current character freq is even   else  :   # If count is n(an even number) push   # n/2 characters to beg and rest   # n/2 characters will form part of end   # string   for   i   in   range  (  count  [  ch  ]  //  2  ):   beg   +=   chr  (  ch  )   ch   +=   1   # end will be reverse of beg   end   =   beg   end   =   end  [::  -  1  ]   # return palindrome string   return   beg   +   chr  (  mid  )   +   end   # Driver code   strr   =   'abbaccd'   print  (  findLongestPalindrome  (  strr  ))   # This code is contributed by mohit kumar 29   
C#
   // C# program to find the longest    // palindrome by removing or   // shuffling characters from    // the given string   using     System  ;   class     GFG   {      // Function to find the longest       // palindrome by removing or       // shuffling characters from       // the given string      static     String     findLongestPalindrome  (  String     str  )         {      // to stores freq of characters in a string      int     []  count     =     new     int  [  256  ];      // find freq of characters       // in the input string      for     (  int     i     =     0  ;     i      <     str  .  Length  ;     i  ++  )         {      count  [  str  [  i  ]]  ++  ;      }      // Any palindromic string consists of       // three parts beg + mid + end      String     beg     =     ''       mid     =     ''       end     =     ''  ;      // solution assumes only lowercase       // characters are present in string.      // We can easily extend this to       // consider any set of characters      for     (  char     ch     =     'a'  ;     ch      <=     'z'  ;     ch  ++  )             {      // if the current character freq is odd      if     (  count  [  ch  ]     %     2     ==     1  )         {          // mid will contain only 1 character.       // It will be overridden with next       // character with odd freq      mid     =     String  .  Join  (  ''    ch  );      // decrement the character freq to make      // it even and consider current       // character again      count  [  ch  --  ]  --  ;      }             // if the current character freq is even      else         {          // 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      <     count  [  ch  ]     /     2  ;     i  ++  )         {      beg     +=     ch  ;      }      }      }      // end will be reverse of beg      end     =     beg  ;      end     =     reverse  (  end  );      // return palindrome string      return     beg     +     mid     +     end  ;      }      static     String     reverse  (  String     str  )         {      // convert String to character array       // by using toCharArray       String     ans     =     ''  ;      char  []     try1     =     str  .  ToCharArray  ();      for     (  int     i     =     try1  .  Length     -     1  ;     i     >=     0  ;     i  --  )         {      ans     +=     try1  [  i  ];      }      return     ans  ;      }      // Driver code      public     static     void     Main  ()         {      String     str     =     'abbaccd'  ;      Console  .  WriteLine  (  findLongestPalindrome  (  str  ));      }   }   // This code is contributed by 29AjayKumar   
JavaScript
    <  script  >   // Javascript program to find the    // longest palindrome by removing   // or shuffling characters from    // the given string   // Function to find the longest    // palindrome by removing   // or shuffling characters from   // the given string      function     findLongestPalindrome  (  str  )      {      // to stores freq of characters       // in a string      let     count     =     new     Array  (  256  );      for  (  let     i  =  0  ;  i   <  256  ;  i  ++  )      {      count  [  i  ]  =  0  ;      }          // find freq of characters in       // the input string      for     (  let     i     =     0  ;     i      <     str  .  length  ;     i  ++  )     {      count  [  str  [  i  ].  charCodeAt  (  0  )]  ++  ;      }          // Any palindromic string consists      // of three parts      // beg + mid + end      let     beg     =     ''       mid     =     ''       end     =     ''  ;          // solution assumes only       // lowercase characters are      // present in string.       // We can easily extend this      // to consider any set of characters      for     (  let     ch     =     'a'  .  charCodeAt  (  0  );         ch      <=     'z'  .  charCodeAt  (  0  );     ch  ++  )     {      // if the current character freq is odd      if     (  count  [  ch  ]     %     2     ==     1  )     {      // mid will contain only 1 character. It      // will be overridden with next character      // with odd freq      mid     =     String  .  fromCharCode  (  ch  );          // decrement the character freq to make      // it even and consider current character      // again      count  [  ch  --  ]  --  ;      }     // if the current character freq is even      else     {      // 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     (  let     i     =     0  ;     i      <     count  [  ch  ]     /     2  ;     i  ++  )         {      beg     +=     String  .  fromCharCode  (  ch  );      }      }      }          // end will be reverse of beg      end     =     beg  ;      end     =     reverse  (  end  );          // return palindrome string      return     beg     +     mid     +     end  ;      }          function     reverse  (  str  )      {      // convert String to character array       // by using toCharArray       let     ans     =     ''  ;      let     try1     =     str  .  split  (  ''  );          for     (  let     i     =     try1  .  length     -     1  ;     i     >=     0  ;     i  --  )     {      ans     +=     try1  [  i  ];      }      return     ans  ;      }          // Driver code      let     str     =     'abbaccd'  ;      document  .  write  (  findLongestPalindrome  (  str  ));          // This code is contributed by unknown2108        <  /script>   

Kimenet
abcdcba 

Időbeli összetettség A fenti megoldás O(n) ahol n a karakterlánc hossza. Mivel az ábécé karaktereinek száma állandó, nem járulnak hozzá az aszimptotikus elemzéshez.
Segédtér a program által használt M, ahol M az ASCII karakterek száma.