longest palindromic substring recursive solution
Longest Palindrome using Recursion in Javascript:
const longestPalindrome = str => {
if (str.length > 1){
let [palindrome1, palindrome2] = [str, str];
for (let i=0;i<Math.floor(str.length/2);i++) {
if(str[i]!==str[str.length-i-1]) {
palindrome1 = longestPalindrome(str.slice(0, str.length-1));
palindrome2 = longestPalindrome(str.slice(1, str.length));
break;
}
}
return palindrome2.length > palindrome1.length ? palindrome2 : palindrome1;
} else {
return str;
}
}
console.log(longestPalindrome("babababababababababababa"));
For this case:
if(S[x] == S[y])
ret = solve(x+1,y-1,val+2 - (x==y));
it should be:
if(S[x] == S[y])
ret = max(solve(x + 1, y - 1, val + 2 - (x==y)), max(solve(x + 1, y, 0),solve(x, y - 1, 0)));
Because, in case you cannot create a substring from x to y, you need to cover the other two cases.
Another bug:
if(ret!=0){ret = val + ret;return ret;}
you should return ret + val
and not modify ret
in this case.
The main problem is you store the final val
into dp[x][y]
, but this is not correct.
Example:
acabc , for x = 1 and y = 1, val = 3, so dp[1][1] = 3
, but actually, it should be 1.
Fix:
int solve(int x,int y)
{
if(x>y)return 0;
int &ret = dp[x][y];
if(ret!=0){return ret;}
if(S[x] == S[y]){
ret = max(max(solve(x + 1, y),solve(x, y - 1)));
int val = solve(x + 1, y - 1);
if(val >= (y - 1) - (x + 1) + 1)
ret = 2 - (x == y) + val;
}else
ret = max(solve(x+1,y),solve(x,y-1));
return ret;
}