子串:字符串中连续的字符片段。
回文:正着看和反着看都一样的字符串。如abba和abbebba是回文,bbab不是回文。
最长回文子串:对于字符串的所有子串,找出是回文且最长的那一个
举例:
(1)babcbabcbaccba的最长回文子串是abcbabcba
(2)bbbb的最长回文子串是其本身
这里给出DP算法,其属于区间动态规划。
代码
#include <iostream>
#include <assert.h>
using namespace std;
//F[i][j]:表示字符i到字符j之间字符串的是否是回文
//F[i][j] = true; str[i] == str[j] && F[i + 1][j - 1] = true;
//F[i][j] = false; 其他
//初始化
//F[i][i] = true;//单个字符认为是回文
//F[i][i - 1] = true;//区间扩展到两个字符时,需要用到该状态
//char strArr[101] = "babcbabcbaccba";
//char strArr[101] = "abab";
//char strArr[101] = "bbab";
char strArr[101] = "bbbb";
bool F[101][101];
bool IsMatch(int i,int j)
{
if (strArr[i] == strArr[j])
{
return true;
}
else
{
return false;
}
}
int DP(char strArr[])
{
assert(strArr);
int nMaxLen = 0;
int nLen = strlen(strArr);
//初始化
for (int i = 0;i < nLen;i++)
{
F[i][i] = true;
}
for (int i = 1;i < nLen;i++)
{
F[i][i - 1] = true;
}
//递推
for (int nCurlen = 2;nCurlen <= nLen;nCurlen++)
{
for (int i = 0;i < nLen - nCurlen + 1;i++)
{
int j = i + nCurlen - 1;
if (IsMatch(i,j) && F[i + 1][j - 1])
{
nMaxLen = max(nMaxLen,j - i + 1);
F[i][j] = true;
}
else
{
F[i][j] = false;
}
}
}
return nMaxLen;
}
int main()
{
cout<<DP(strArr)<<endl;
system("pause");
return 1;
}