LeetCode 0647. Palindromic Substrings Solution in Java, Python, C++, JavaScript, Go & Rust | Explanation + Code

CoderIndeed
0
0647. Palindromic Substrings

Description

Given a string s, return the number of palindromic substrings in it.

A string is a palindrome when it reads the same backward as forward.

A substring is a contiguous sequence of characters within the string.

 

Example 1:

Input: s = "abc"
Output: 3
Explanation: Three palindromic strings: "a", "b", "c".

Example 2:

Input: s = "aaa"
Output: 6
Explanation: Six palindromic strings: "a", "a", "a", "aa", "aa", "aaa".

 

Constraints:

  • 1 <= s.length <= 1000
  • s consists of lowercase English letters.

Solutions

Solution 1: Expand Around Center

We can enumerate the center position of each palindrome and expand outward to count the number of palindromic substrings. For a string of length n, there are 2n-1 possible center positions (covering both odd-length and even-length palindromes). For each center, we expand outward until the palindrome condition is no longer satisfied, and count the number of palindromic substrings.

The time complexity is O(n^2), where n is the length of string s. The space complexity is O(1).

PythonJavaC++GoJavaScript
class Solution: def countSubstrings(self, s: str) -> int: ans, n = 0, len(s) for k in range(n * 2 - 1): i, j = k // 2, (k + 1) // 2 while ~i and j < n and s[i] == s[j]: ans += 1 i, j = i - 1, j + 1 return ans(code-box)

Solution 2: Manacher's Algorithm

In Manacher's algorithm, p[i] - 1 represents the maximum palindrome length centered at position i, and the number of palindromic substrings centered at position i is \left \lceil p[i]-12 \right \rceil.

The time complexity is O(n) and the space complexity is O(n), where n is the length of string s.

PythonJavaC++GoTypeScript
class Solution: def countSubstrings(self, s: str) -> int: t = '^#' + '#'.join(s) + '#$' n = len(t) p = [0 for _ in range(n)] pos, maxRight = 0, 0 ans = 0 for i in range(1, n - 1): p[i] = min(maxRight - i, p[2 * pos - i]) if maxRight > i else 1 while t[i - p[i]] == t[i + p[i]]: p[i] += 1 if i + p[i] > maxRight: maxRight = i + p[i] pos = i ans += p[i] // 2 return ans(code-box)

Post a Comment

0Comments

Post a Comment (0)

#buttons=(Accept !) #days=(20)

Our website uses cookies to enhance your experience. Check Now
Accept !