Longest Palindrome

Updated on 04 June, 2025
Longest Palindrome header image

Problem Statement

The task requires determining the maximum length of a palindrome that can be formed using the characters from a given string s. A palindrome is a sequence of characters that reads the same forward and backward. The input string includes both lowercase and uppercase English letters, and case sensitivity is crucial (i.e., 'A' and 'a' are considered different characters). The problem involves understanding not just how to count these characters, but how to strategically arrange them to maximize the palindrome length.

Examples

Example 1

Input:

s = "abccccdd"

Output:

7

Explanation:

One longest palindrome that can be built is "dccaccd", whose length is 7.

Example 2

Input:

s = "a"

Output:

1

Explanation:

The longest palindrome that can be built is "a", whose length is 1.

Constraints

  • 1 <= s.length <= 2000
  • s consists of lowercase and/or uppercase English letters only.

Approach and Intuition

The approach to solving the longest palindrome problem involves these intuitive steps:

  1. Count Occurrences of Each Character:
    Start by counting how many times each character appears in the string. This can efficiently be done using a dictionary where keys are characters and values are their respective counts.

  2. Analyze Character Counts:

    • A character that appears an even number of times can be fully used in the palindrome. For example, if 'b' appears 2 times, both can be used to place 'b' on both sides of the palindrome like "b...b".
    • For characters that appear an odd number of times, use the largest even number that is less than their count. For instance, if a character appears 5 times, you can use 4 of them in the palindrome.
    • If any character count is odd, one character (from any of these with odd counts) can be placed in the center of the palindrome.
  3. Constructing the Longest Palindrome:

    • Sum up all the even counts and the largest even parts of odd counts.
    • Add one more to the total if there is at least one character with an odd count, as this can be used as a central pivot in the palindrome which does not need a symmetrical counterpart.

These intuitions lead to a methodical building of the longest palindrome possible, based on the character frequencies in the input string. Observing that adding characters to the left and right of a central pivot maintains the palindrome property is key in understanding why and how characters with various counts contribute differently to the palindrome length.

Solutions

  • C++
  • Java
  • Python
cpp
class Solution {
public:
    int findLongestPalindromeLength(string str) {
        unordered_set<char> chars;
        int result = 0;

        for (char ch : str) {
            if (chars.count(ch)) {
                chars.erase(ch);
                result += 2;
            } else {
                chars.insert(ch);
            }
        }

        if (!chars.empty()) {
            result++;
        }

        return result;
    }
};

The provided C++ solution focuses on finding the length of the longest palindrome that can be formed from a given string. It utilizes an unordered_set to track characters from the string and determine how many pairs of characters (i.e., characters that can form the two halves of a palindrome) are present in the input string.

  • The function findLongestPalindromeLength starts with initializing an empty unordered_set named chars and an integer result set to 0. This set helps keep track of characters that have an unpaired occurrence in the string.
  • The solution iterates through each character in the input string:
    • If the character is already in the chars set, it means a pair is completed. The character is removed from the set, and result is incremented by 2 (accounting for both the current character and its pair).
    • If the character is not in the set, it's added to the set, indicating an unmatched character so far.
  • After processing all characters, if the chars set is not empty, it means there are characters without a pair. Thus, one such character can be used as the middle part of a palindrome. Consequently, result is incremented by 1 to account for the middle character.
  • The function finally returns the value of result, which represents the maximum length of the palindrome that can be constructed from the given string.

This approach efficiently calculates the longest possible palindrome length by using each character to its maximum potential either as a part of paired characters or potentially as a middle character in an odd-length palindrome.

java
class Solution {

    public int findLongestPalindromicLength(String inputStr) {
        Set<Character> charCounter = new HashSet<>();
        int lengthCount = 0;

        // Iterate over each character in the input string
        for (char element : inputStr.toCharArray()) {
            // Check if character already seen
            if (charCounter.contains(element)) {
                charCounter.remove(element);
                // Add 2 for each complete pair found
                lengthCount += 2;
            } else {
                // Store the unpaired character
                charCounter.add(element);
            }
        }

        // If there are any characters without a pair
        if (!charCounter.isEmpty()) lengthCount++;

        return lengthCount;
    }
}

The Java solution provided is designed to determine the length of the longest palindrome that can be built using the characters from a given input string. Here's a breakdown of how the solution approaches the problem:

  • It utilizes a HashSet named charCounter to keep track of characters that appear an odd number of times.

  • The main logic iterates over each character of the input string:

    • If a character is already in the HashSet, it means a pair is completed (since the character has been encountered again). Hence, the character is removed from the set, and the length count is increased by 2.
    • If a character is not in the set, it is added to the set indicating that it's the first occurrence of this character (unpaired so far).
  • After the iteration:

    • The code checks if the HashSet is not empty, indicating the existence of characters that have no pairs. Adding one to the length count accounts for potentially using one of those characters as the center of an odd-length palindrome.
  • The function returns the maximum possible length of a palindrome that can be constructed with the characters from the input string.

Adjust the approach slightly to potentially optimize or handle specific constraints, but ensure that the core logic aligns with the character counting and pairing mechanism described. Always remember to handle edge cases such as empty input or a string where no two characters are alike.

python
class Solution:
    def findLongestPalindromeLength(self, input_string: str) -> int:
        char_tracker = set()
        palindrome_length = 0

        for char in input_string:
            if char in char_tracker:
                char_tracker.remove(char)
                palindrome_length += 2
            else:
                char_tracker.add(char)

        if char_tracker:
            palindrome_length += 1

        return palindrome_length

The given Python 3 code is designed to find the length of the longest palindrome that can be formed using the characters of a given input string. The function findLongestPalindromeLength implemented in the Solution class operates as follows:

  • Initialize a set named char_tracker to keep track of characters and an integer palindrome_length set to zero. These will store unique characters and the count of characters that can form palindrome pairs.
  • Iterate over each character in the string. For each character:
    • If the character already exists in char_tracker, it means a pair can be formed. Thus, remove the character from char_tracker and increase palindrome_length by 2.
    • If the character is not in char_tracker, add it to the set for potential pairing with a future matching character.
  • After processing all characters, if char_tracker is not empty, it means there are characters that didn't form a pair. In such a case, add one more to palindrome_length to account for a possible central character in an odd-length palindrome.
  • Return the value of palindrome_length, which represents the length of the longest possible palindrome.

This approach ensures efficient checking and updating of character pairs, making it suitable for determining the maximum length of a palindrome that can be formed from the characters of a given string.

Comments

No comments yet.