Start learning free

LESSON 247 OF 410 · TWO POINTERS

Palindrome Substrings II in Java with Time Complexity Analysis

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

    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 consider the following approaches:

    Naive Solution

    The naive solution involves generating all possible substrings of the given string and checking each one to see if it is a palindrome. This approach is not optimal due to its high time complexity.

    Optimized Solution

    We can optimize the solution using dynamic programming or expand around center technique:

    Dynamic Programming Approach

    We use a 2D array to store whether a substring is a palindrome. The idea is to build up the solution for larger substrings using the solutions for smaller substrings.

    Expand Around Center Approach

    We can also count palindromes by expanding around each possible center of the palindrome. This approach is more space-efficient than the dynamic programming approach.

    Algorithm

    Let's break down the Expand Around Center approach:

    1. Initialize a count to 0.
    2. For each character in the string, consider it as the center of a palindrome and expand outwards to check for palindromes of both odd and even lengths.
    3. Increment the count for each 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;
        }
    
        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), where n is the length of the string. This is because we are expanding around each center, and in the worst case, we expand to the entire length of the string. The space complexity is O(1) as we are not using any extra space proportional to the input size.

    Edge Cases

    Consider the following edge cases:

    • Empty string: The output should be 0.
    • String with one character: The output should be 1.
    • String with all identical characters: The output should be the sum of the first n natural numbers, where n is the length of the string.

    Testing

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

    • Input: "a" - Output: 1
    • Input: "aa" - Output: 3
    • Input: "abc" - Output: 3
    • Input: "aaa" - Output: 6

    Use a testing framework like JUnit to automate the testing process.

    Thinking and Problem-Solving Tips

    When approaching such problems, consider breaking down the problem into smaller parts and solving each part step-by-step. Practice similar problems to improve your problem-solving skills and understand different algorithms and their applications.

    Conclusion

    Understanding and solving problems related to palindromic substrings is crucial for various applications in computer science. By practicing and exploring different approaches, you can improve your problem-solving skills and algorithmic thinking.

    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