思路一:
动态规划. 创立一个表格flag, 长与宽都为字符串s的长度. 表格flag中的每一项flag[i][j]都表示子字符串s[i]到s[j]是否是回文串. 主要工作就是填充这个表格.
首先是初始化工作, 将这个矩阵的下半个三角部分, 包括对角线都初始化为true, 对角线为真的原因是当i == j的时候, s[i] == s[j], 一个字母本身一定是回文串. 剩下的部分就是当i > j的时候, 此时设置为真是当s中有相邻的两个相同的字符或者两个相同字符中间只间隔着一个字符时, 由于对于每个flag[i][j], 我们都要看flag[i + 1][j - 1]的结果, 如果i和j相连, i + 1 > j - 1, 而只要遇到这种情况时, s[i]到s[j]一定是回文串, 所以一定会是真.
唯一需要考虑的就是i < j的情况, 如果s[i] == s[j]并且i < j, 那么我们就要把flag[i + 1][j - 1]的结果放到flag[i][j]中, 然后再比较更新start和maxlen的数据.
string longestPalindrome(string s) {
int len = s.length(), start = 0, maxlen = 1;
int flag[len][len] = {0};
for (int i = 0; i < len; i++) {
for (int j = 0; j < len; j++) {
if (i >= j)
flag[i][j] = true;
else
flag[i][j] = false;
}
}
for (int j = 1; j < len; j++) {
for (int i = 0; i < j; i++) {
if (s[i] == s[j]) {
flag[i][j] = flag[i + 1][j - 1];
if (flag[i][j] && j - i + 1 > maxlen) {
maxlen = j - i + 1;
start = i;
}
else
flag[i][j] = false;
}
}
}
return s.substr(start, maxlen);
}