回文子串意思是字串的正序和反序字符相同 这里我选择动态规划的方式
使用动态规划的方式,主要是根据状态转移方程 P(i,j) = P(i+1,j-1) ^ (S(i)==S(j)) S表示上一个相等的字串
要解决这个问题可以设计一个DP二维数据 bool[][] bp = new bool[len][];
而数据dp[i][j] = true;表示字符串从i到j的内容是回文字串
dp又要如何构建呢,我们知道长度为1是字符是回文串,而长度大于2,且i-1和j+1是相等,那么现在回文字串长度变成了2,根据这个思想我们可以反向推理
长度大于2时且j-i>2时,那么dp[i][j] = dp[i+1][j-1]表示当前等于左右缩小范围的值,相当于长度为三的等于长度为1的值,这样就找出了所有长度的值
我们可以枚举所有字串长度,从2到str.length循环到最后可以找到最长回文子串,其中maxL和minL是为了不循环数组每次记录最长的字串,最后截取长度就能找出最长回文字串
public async static Task<string> LongestPalindrome(string str)
{
if (str.Length < 2) {
return str;
}
int maxL = 1;
int minL = 0;char[] chars = str.ToCharArray();
int len = chars.Length;bool[][] bp = new bool[len][];
for (int i = 0; i < len; i++)
{
bp[i] = new bool[len];
bp[i][i] = true;
}
//长度
for (int s = 2; s <= len; s++)
{
for (int i = 0; i < len; i++)
{
// 长度s = j-i+1;
int j = s + i - 1;if (j >= len) {
break;
}if (chars[i] == chars[j])
{
if (j - i > 2)
{
bp[i][j] = bp[i + 1][j - 1];
}
else
{
bp[i][j] = true;
}
}
else {
bp[i][j] = false;
}if (bp[i][j] && j - i + 1 > maxL) {
maxL = j - i + 1;
minL = i;
}
}
}return str.Substring(minL,maxL) ;
}