Start learning free

LESSON 247 OF 410 · TWO POINTERS

Palindrome Substrings II in Python with O(n^2) Time Complexity

Practice O(n2) Read the full explanation

Given a string, count the number of palindromic contiguous substrings in the string.

The substrings with different start indexes or end indexes are counted as different substrings even if they consist of same characters.

Example:

Input:  "abbcbc"

Output: 9

Explanation: ["a", "b", "b", "c", "b", "c", "bb", "bcb", "cbc"]
STEP 1 OF 10
    Ctrl + Enter to check

    PYTHON · TWO POINTERS

    Palindrome Substrings in Python, explained

    Understanding the Problem

    The core challenge of this problem is to identify all substrings of a given string that are palindromic. A palindrome is a string that reads the same forward and backward. The problem requires counting all such substrings, considering different start and end indices as distinct substrings even if they consist of the same characters.

    Common applications of this problem include text processing, DNA sequence analysis, and any domain where pattern recognition within strings is crucial.

    Potential pitfalls include missing some palindromic substrings or counting non-palindromic substrings due to incorrect logic.

    Approach

    To solve this problem, we can use a dynamic programming approach. The idea is to use a 2D table to keep track of palindromic substrings. We can also use a center expansion technique to optimize the solution.

    Naive Solution

    A naive solution would involve generating all possible substrings and checking each one for being a palindrome. This approach is not optimal due to its high time complexity of O(n^3).

    Optimized Solution

    We can use a dynamic programming approach to reduce the time complexity to O(n^2). The idea is to use a 2D table where dp[i][j] is True if the substring from index i to j is a palindrome.

    Center Expansion Technique

    Another optimized approach is the center expansion technique. For each character (and each pair of characters), we expand outwards as long as we have a palindrome. This approach also has a time complexity of O(n^2).

    Algorithm

    Here is a step-by-step breakdown of the center expansion technique:

    1. Initialize a count to 0.
    2. For each character in the string, consider it as the center of a palindrome and expand outwards.
    3. For each pair of characters, consider them as the center of a palindrome and expand outwards.
    4. Count each valid palindrome found during the expansion.

    Code Implementation

    def count_palindromic_substrings(s):
        # Helper function to count palindromes centered at left and right
        def expand_around_center(s, left, right):
            count = 0
            while left >= 0 and right < len(s) and s[left] == s[right]:
                count += 1
                left -= 1
                right += 1
            return count
    
        total_count = 0
        for i in range(len(s)):
            # Odd length palindromes (single character center)
            total_count += expand_around_center(s, i, i)
            # Even length palindromes (two character center)
            total_count += expand_around_center(s, i, i + 1)
    
        return total_count
    
    # Example usage
    input_string = "abbcbc"
    print(count_palindromic_substrings(input_string))  # Output: 9
    

    Complexity Analysis

    The time complexity of the center expansion technique is O(n^2) because we are expanding around each character and each pair of characters. The space complexity is O(1) as we are not using any extra space proportional to the input size.

    Edge Cases

    Potential edge cases include:

    • Empty string: The output should be 0.
    • String with all identical characters: Every substring is a palindrome.
    • String with no palindromic substrings longer than 1 character.

    Examples:

    Input: ""
    Output: 0
    
    Input: "aaaa"
    Output: 10
    
    Input: "abc"
    Output: 3
    

    Testing

    To test the solution comprehensively, consider the following test cases:

    • Simple cases with short strings.
    • Strings with mixed characters.
    • Strings with repeated characters.
    • Edge cases like empty strings and single character strings.

    Thinking and Problem-Solving Tips

    When approaching such problems, it is essential to:

    • Understand the problem requirements and constraints thoroughly.
    • Consider both naive and optimized solutions.
    • Break down the problem into smaller, manageable parts.
    • Practice similar problems to improve problem-solving skills.

    Conclusion

    Counting palindromic substrings is a common problem in string processing. Understanding and implementing efficient algorithms like the center expansion technique can significantly improve performance. Practice and familiarity with such problems are crucial for developing strong problem-solving skills.

    Additional Resources

    For further reading and practice, consider the following resources:

    Keep going with PythonAbout 340 step-by-step lessons, from your first line of code to coding interviews. Free to start.
    Start learning free