Skip to main content
5. Longest Palindromic Substring - Solution

5. Longest Palindromic Substring

Problem Statement

Given a string s, return the longest palindromic substring in s.

Examples

Example 1:
Input: s = "babad" Output: "bab" Explanation: "aba" is also a valid answer.
Example 2:
Input: s = "cbbd" Output: "bb"

Difficulty

Medium

Solution 1: Dynamic Programming

Approach:

We use a 2D array dp[i][j] to track whether the substring s[i...j] is a palindrome. The core idea is that a string is a palindrome if its first and last characters are equal and the inner substring is also a palindrome.

Specifically, dp[i][j] is true if s[i] == s[j] and either the substring length is less than or equal to 3 (like "aba" or "aa"), or the precomputed value dp[i+1][j-1] is true. We iterate through all possible lengths and starting positions, filling the table to find the longest substring where dp[i][j] holds true.

Time Complexity: O(n²)
Space Complexity: O(n²) to store the DP table.

Solution 2: Central Expansion (Optimal)

Approach:

A palindrome mirrors around its center. We can iterate through each possible center (of which there are 2n - 1, including characters and the gaps between them) and expand outwards. As long as the characters on the left and right match, we continue expanding. This method is more efficient than Dynamic Programming because it only requires constant space.

Java


class Solution {
    public String longestPalindrome(String s) {
        if (s == null || s.length() < 1) return "";
        int start = 0, end = 0;
        for (int i = 0; i < s.length(); i++) {
            int len1 = expandAroundCenter(s, i, i);
            int len2 = expandAroundCenter(s, i, i + 1);
            int len = Math.max(len1, len2);
            if (len > end - start) {
                start = i - (len - 1) / 2;
                end = i + len / 2;
            }
        }
        return s.substring(start, end + 1);
    }

    private int expandAroundCenter(String s, int left, int right) {
        while (left >= 0 && right < s.length() && s.charAt(left) == s.charAt(right)) {
            left--;
            right++;
        }
        return right - left - 1;
    }
}

C++


class Solution {
public:
    string longestPalindrome(string s) {
        int n = s.size();
        if (n < 2) return s;
        int start = 0, maxLen = 1;
        auto expand = [&](int l, int r) {
            while (l >= 0 && r < n && s[l] == s[r]) {
                if (r - l + 1 > maxLen) {
                    start = l;
                    maxLen = r - l + 1;
                }
                l--; r++;
            }
        };
        for (int i = 0; i < n; ++i) {
            expand(i, i);
            expand(i, i + 1);
        }
        return s.substr(start, maxLen);
    }
};

Python


class Solution:
    def longestPalindrome(self, s: str) -> str:
        def expand(l, r):
            while l >= 0 and r < len(s) and s[l] == s[r]:
                l -= 1
                r += 1
            return s[l + 1 : r]

        ans = ""
        for i in range(len(s)):
            s1 = expand(i, i)
            s2 = expand(i, i + 1)
            if len(s1) > len(ans): ans = s1
            if len(s2) > len(ans): ans = s2
        return ans
Time Complexity: O(n²)
Space Complexity: O(1)

← All Problems

Comments

Popular posts from this blog

128. Longest Consecutive Sequence - Solution 128. Longest Consecutive Sequence Problem Statement Given an unsorted array of integers nums , return the length of the longest consecutive elements sequence. You must write an algorithm that runs in O(n) time. Examples Example 1: Input: nums = [100,4,200,1,3,2] Output: 4 Explanation: The longest consecutive elements sequence is [1, 2, 3, 4]. Therefore its length is 4. Example 2: Input: nums = [0,3,7,2,5,8,4,6,0,1] Output: 9 Difficulty Hard Solution 1: Sorting Approach: Sort the array and traverse it. Skip duplicates. If the current number is prev + 1 , increment the count; otherwise, reset it. Keep track of the maximum count. Java class Solution { public int longestConsecutive(int[] nums) { if (nums.length == 0) return 0; Arrays.sort(nums); int ans = 1, t = 1; for (int i = 1; i C++ class Solution { publi...
1. Two Sum Problem Statement Given an array of integers nums and an integer target , return indices of the two numbers such that they add up to target . You may assume that each input has exactly one solution, and you may not use the same element twice. You can return the answer in any order. Examples Example 1: Input: nums = [2,7,11,15], target = 9 Output: [0,1] Explanation: Because nums[0] + nums[1] == 9, we return [0, 1]. Example 2: Input: nums = [3,2,4], target = 6 Output: [1,2] Example 3: Input: nums = [3,3], target = 6 Output: [0,1] Difficulty Easy Constraints 2 ≤ nums.length ≤ 10⁴ -10⁹ ≤ nums[i] ≤ 10⁹ -10⁹ ≤ target ≤ 10⁹ Only one valid answer exists Solution 1: Using Hash Map Approach: Use a hash map to store value → index Iterate through array Check complement (target - current value) If found, return answer Else store value Java class Solution { public int[] twoSum(int[] nums, int target) {...
133. Clone Graph - Solution 133. Clone Graph Problem Statement Given a reference of a node in a connected undirected graph, return a deep copy (clone) of the graph. Each node in the graph contains a value ( int ) and a list ( List[Node] ) of its neighbors. class Node { public int val; public List<Node> neighbors; } Test case format: For simplicity, each node's value is the same as the node's index (1-indexed). For example, the first node with val = 1 , the second node with val = 2 , and so on. The graph is represented in the test case using an adjacency list. An adjacency list is a collection of unordered lists used to represent a finite graph. Each list describes the set of neighbors of a node in the graph. The given node will always be the first node with val = 1 . You must return the copy of the given node as a reference to the cloned graph. Examples Example 1: Input: a...