最长回文子序列,处理办法和最长公共子序列类似,不过是子问题发生了改变,在当前问题中,子问题是在首部和尾部的字符是否一样,开展形式和LCS一致,附上递归和for循环的代码。
int lengthdp[100][100] = {};
string resultDp[100][100] = {};
void Palindrome2(char const* chars, int start, int end)
{
if (lengthdp[start][end] || start > end)
{
return;
}
if (start == end)
{
lengthdp[start][end] = 1;
resultDp[start][end] = chars[start];
return;
}
if (chars[start] == chars[end])
{
Palindrome2(chars, start + 1, end - 1);
lengthdp[start][end] = lengthdp[start + 1][end - 1] + 2;
resultDp[start][end] = chars[start] + resultDp[start + 1][end - 1] + chars[start];
}
else
{
Palindrome2(chars, start + 1, end);
Palindrome2(chars, start, end - 1);
if (lengthdp[start + 1][end] > lengthdp[start][end - 1])
{
lengthdp[start][end] = lengthdp[start + 1][end];
resultDp[start][end] = resultDp[start + 1][end];
}
else
{
lengthdp[start][end] = lengthdp[start][end - 1];
resultDp[start][end] = resultDp[start][end - 1];
}
}
}
void Palindrome3(char const* chars, int length)
{
for (int i = 0; i < length; i++)
{
lengthdp[i][i] = 1;
resultDp[i][i] = chars[i];
}
for (int p_length = 2; p_length <= length; p_length++)
{
for (int start = 0; start < length; start++)
{
int end = start + p_length - 1;
if (chars[start] == chars[end])
{
lengthdp[start][end] = lengthdp[start + 1][end - 1] + 2;
resultDp[start][end] = chars[start] + resultDp[start + 1][end - 1] + chars[start];
}
else
{
if (lengthdp[start + 1][end] >= lengthdp[start][end - 1])
{
lengthdp[start][end] = lengthdp[start + 1][end];
resultDp[start][end] = resultDp[start + 1][end];
}
else
{
lengthdp[start][end] = lengthdp[start][end - 1];
resultDp[start][end] = resultDp[start][end - 1];
}
}
}
}
}