查找通过从字符串中删除或改组字符形成的最长回文
给定一个字符串,找出可以通过从字符串中删除或改组字符来构造的最长回文。如果有多个最长长度的回文字符串,则只返回一个回文字符串。
例子:
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
我们可以将任何回文字符串分成三部分——beg、mid和end。对于奇数长度的回文字符串,例如 2n + 1,“beg”由字符串的前 n 个字符组成,“mid”将仅包含 1 个字符,即第 (n + 1) 个字符,“end”将由最后 n 个字符组成的回文字符串。对于偶数长度为 2n 的回文字符串,'mid' 将始终为空。应该注意的是,'end' 将与 'beg' 反转,以使字符串成为回文。
我们的想法是在我们的解决方案中使用上述观察。由于允许对字符进行改组,因此输入字符串中的字符顺序无关紧要。我们首先得到输入字符串中每个字符的频率。那么输入字符串中所有偶数出现的字符(比如 2n)都将成为输出字符串的一部分,因为我们可以轻松地将 n 个字符放在“beg”字符串中,将其他 n 个字符放在“end”字符串中(通过保留回文顺序) )。对于奇数出现的字符(比如 2n + 1),我们用所有这些字符之一填充 'mid'。剩下的 2n 个字符被分成两半并在开头和结尾添加。
下面是上述想法的实现——
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
输出:
abcdcba