1930. Unique Length-3 Palindromic Subsequences
Description
Given a string s, return the number of unique palindromes of length three that are a subsequence of s.
Note that even if there are multiple ways to obtain the same subsequence, it is still only counted once.
A palindrome is a string that reads the same forwards and backwards.
A subsequence of a string is a new string generated from the original string with some characters (can be none) deleted without changing the relative order of the remaining characters.
- For example,
"ace"is a subsequence of"abcde".
Example 1:
Input: s = "aabca" Output: 3 Explanation: The 3 palindromic subsequences of length 3 are: - "aba" (subsequence of "aabca") - "aaa" (subsequence of "aabca") - "aca" (subsequence of "aabca")
Example 2:
Input: s = "adc" Output: 0 Explanation: There are no palindromic subsequences of length 3 in "adc".
Example 3:
Input: s = "bbcbaba" Output: 4 Explanation: The 4 palindromic subsequences of length 3 are: - "bbb" (subsequence of "bbcbaba") - "bcb" (subsequence of "bbcbaba") - "bab" (subsequence of "bbcbaba") - "aba" (subsequence of "bbcbaba")
Constraints:
3 <= s.length <= 105sconsists of only lowercase English letters.
Solutions
Solution 1: Enumerate Both End Characters + Hash Table
Thinking
A length-\(3\) palindromic subsequence has the form \(c\_c\). Enumerating triples is impossible for \(n\le 10^5\).
There are only \(26\) letters, so we enumerate the two ends. For a fixed \(c\), the number of distinct characters strictly between its first and last occurrence is the number of distinct palindromes with those ends.
\(\texttt{find}/\texttt{rfind}\) locate the ends and a set counts the middle, in \(O(n|\Sigma|)\) time.
Since the string contains only lowercase letters, we can directly enumerate all pairs of end characters. For each pair of end characters \(c\), we find their first and last occurrence positions \(l\) and \(r\) in the string. If \(r - l > 1\), it means we have found a palindromic subsequence that meets the conditions. We then count the number of unique characters between \([l+1,..r-1]\), which gives the number of palindromic subsequences with \(c\) as the end characters, and add it to the answer.
After enumerating all pairs, we get the answer.
The time complexity is \(O(n \times |\Sigma|)\), where \(n\) is the length of the string and \(\Sigma\) is the size of the character set. In this problem, \(|\Sigma| = 26\). The space complexity is \(O(|\Sigma|)\) or \(O(1)\).
1 2 3 4 5 6 7 8 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | |