Count Different Palindromic Subsequences
Given a string s consisting of characters 'a', 'b', 'c', 'd', count the number of different non-empty palindromic subsequences. Return result mod 10^9 + 7.
Example: s = "bccb" → Output: 6 ("b","c","bb","bc","cb","bccb")
Sample Input
—
Sample Output
—
Constraints
- 1 <= s.length <= 1000
- s contains only a, b, c, d
Test Cases
Case 1
Args: ["bccb"]
Expected: 6
Interval DP
dp[i][j] = count of unique palindromic subsequences in s[i..j].
function countPalindromicSubsequences(s) {
const MOD = 1e9 + 7, n = s.length;
const dp = Array.from({length: n}, () => Array(n).fill(0));
for (let i = 0; i < n; i++) dp[i][i] = 1;
for (let len = 2; len <= n; len++) {
for (let i = 0; i + len - 1 < n; i++) {
const j = i + len - 1;
if (s[i] === s[j]) {
let lo = i + 1, hi = j - 1;
while (lo <= hi && s[lo] !== s[i]) lo++;
while (lo <= hi && s[hi] !== s[i]) hi--;
if (lo > hi) dp[i][j] = dp[i+1][j-1] * 2 + 2;
else if (lo === hi) dp[i][j] = dp[i+1][j-1] * 2 + 1;
else dp[i][j] = dp[i+1][j-1] * 2 - dp[lo+1][hi-1];
} else {
dp[i][j] = dp[i+1][j] + dp[i][j-1] - dp[i+1][j-1];
}
dp[i][j] = ((dp[i][j] % MOD) + MOD) % MOD;
}
}
return dp[0][n-1];
}
Time: O(n²) | Space: O(n²)
Saved in this browser only. Private to you.