📌  相关文章
📜  查找通过从字符串中删除或改组字符形成的最长回文

📅  最后修改于: 2022-05-13 01:57:07.345000             🧑  作者: Mango

查找通过从字符串中删除或改组字符形成的最长回文

给定一个字符串,找出可以通过从字符串中删除或改组字符来构造的最长回文。如果有多个最长长度的回文字符串,则只返回一个回文字符串。
例子:

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