Given a string, find the length of the longest palindromic subsequence in it. For example, the length of the longest palindromic subsequence for 'bbbab' is 4 and the sequence is 'bbbb'.
This algorithm uses memoization to improve performance. It's same as the recursive version of Longest palindromic subsequence (LPS), but with a special 'cache' to store results. The 'cache key' is crucial. It's how we identify and store past results. Sometimes we need one key, sometimes multiple keys. We add code to:
cache = None
def count(s, iKey, jKey):
n = len(s)
if n == 0:
return 0
if n == 1:
return 1
global cache
if not cache:
cache = [[None] * n for _ in range(n)]
if not cache[iKey][jKey]:
if s[0] == s[-1]:
cache[iKey][jKey] = 2 + count(s[1:-1], iKey + 1, jKey - 1)
else:
cache[iKey][jKey] = max(count(s[1:], iKey + 1, jKey), count(s[0:-1], iKey, jKey - 1))
return cache[iKey][jKey]
s = 'character'
print(count(s, 0, len(s) -1))
let cache = null;
function count(s, iKey, jKey) {
const n = s.length;
if (n === 0) {
return 0;
}
if (n === 1) {
return 1;
}
if (cache === null) {
cache = Array(s.length);
for (let i = 0; i < s.length; i++) {
cache[i] = Array(s.length).fill(null);
}
}
if (!cache[iKey][jKey]) {
if (s.at(0) === s.at(-1)) {
cache[iKey][jKey] = 2 + count(s.slice(1, -1), iKey + 1, jKey - 1);
} else {
cache[iKey][jKey] = Math.max(count(s.slice(1), iKey + 1, jKey), count(s.slice(0, -1), iKey, jKey - 1));
}
}
return cache[iKey][jKey];
}
const str = 'character';
console.log(count(str, 0, str.length - 1));