Back to all solutions
#2484 - Count Palindromic Subsequences
Problem Description
Given a string of digits s, return the number of palindromic subsequences of s having length 5.
Since the answer may be very large, return it modulo 109 + 7.
Note:
- A string is palindromic if it reads the same forward and backward.
- A subsequence is a string that can be derived from another string by deleting some or no characters without changing the order of the remaining characters.
Solution
/**
* @param {string} s
* @return {number}
*/
var countPalindromes = function(s) {
const MOD = 1e9 + 7;
const n = s.length;
const prefixPairs = new Array(n).fill(0).map(() => new Array(100).fill(0));
const suffixPairs = new Array(n).fill(0).map(() => new Array(100).fill(0));
for (let i = 1; i < n; i++) {
for (let pair = 0; pair < 100; pair++) {
prefixPairs[i][pair] = prefixPairs[i - 1][pair];
}
for (let j = 0; j < i; j++) {
const pair = parseInt(s[j]) * 10 + parseInt(s[i]);
prefixPairs[i][pair]++;
}
}
for (let i = n - 2; i >= 0; i--) {
for (let pair = 0; pair < 100; pair++) {
suffixPairs[i][pair] = suffixPairs[i + 1][pair];
}
for (let j = i + 1; j < n; j++) {
const pair = parseInt(s[i]) * 10 + parseInt(s[j]);
suffixPairs[i][pair]++;
}
}
let result = 0;
for (let i = 2; i < n - 2; i++) {
for (let first = 0; first < 10; first++) {
for (let second = 0; second < 10; second++) {
const leftPair = first * 10 + second;
const rightPair = second * 10 + first;
result = (result + (prefixPairs[i - 1][leftPair]
* suffixPairs[i + 1][rightPair]) % MOD) % MOD;
}
}
}
return result;
};