Start learning free

LESSON 246 OF 410 · TWO POINTERS

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

Practice O(n3) 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 7
    Ctrl + Enter to check

    JAVA · TWO POINTERS

    Palindrome Substrings in Java, 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 significance of this problem lies in its applications in text processing, DNA sequence analysis, and other fields where pattern recognition is crucial.

    Potential pitfalls include not accounting for overlapping substrings and not efficiently checking for palindromes, which can lead to suboptimal solutions.

    Approach

    To solve this problem, we can use a dynamic programming approach or expand around the center technique. Let's discuss both:

    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: Expand Around Center

    A more efficient approach is to expand around each possible center of the palindrome. This method has a time complexity of O(n^2) and is more suitable for this problem.

    Algorithm

    Here is a step-by-step breakdown of the "Expand Around Center" algorithm:

    1. Initialize a count to zero.
    2. Iterate through each character in the string, treating each character and each pair of consecutive characters as potential centers of palindromes.
    3. For each center, expand outwards while the substring remains a palindrome, incrementing the count for each valid palindrome found.

    Code Implementation

    
    public class PalindromeSubstrings {
        // Function to count palindromic substrings
        public int countSubstrings(String s) {
            int n = s.length();
            int count = 0;
    
            // Expand around center approach
            for (int center = 0; center < 2 * n - 1; center++) {
                int left = center / 2;
                int right = left + center % 2;
    
                while (left >= 0 && right < n && s.charAt(left) == s.charAt(right)) {
                    count++;
                    left--;
                    right++;
                }
            }
            return count;
        }
    
        // Main method to test the function
        public static void main(String[] args) {
            PalindromeSubstrings ps = new PalindromeSubstrings();
            String input = "abbcbc";
            System.out.println("Number of palindromic substrings: " + ps.countSubstrings(input));
        }
    }
    

    Complexity Analysis

    The time complexity of the "Expand Around Center" approach is O(n^2) because we are expanding around each center, and there are 2n-1 such centers. The space complexity is O(1) as we are using a constant amount of extra space.

    Edge Cases

    Potential edge cases include:

    • Empty string: Should return 0.
    • String with all identical characters: Should correctly count all possible palindromic substrings.

    Examples:

    Input: ""
    Output: 0
    
    Input: "aaaa"
    Output: 10
    

    Testing

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

    • Simple cases with short strings.
    • Strings with mixed characters.
    • Strings with repeated characters.

    Using a testing framework like JUnit can help automate and validate these test cases.

    Thinking and Problem-Solving Tips

    When approaching such problems, consider breaking down the problem into smaller parts and think about different ways to optimize the solution. Practice similar problems to improve your problem-solving skills and understand various algorithmic techniques.

    Conclusion

    Understanding and solving the problem of counting palindromic substrings is crucial for various applications. By using the "Expand Around Center" approach, we can achieve an efficient solution with a time complexity of O(n^2). Practice and exploration of similar problems will further enhance your skills.

    Additional Resources

    For further reading and practice, consider the following resources:

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