动态规划:
f[i][j]
表示字符串 s 的第 i 个字符到第 j 个字符是否为回文子串;
f[i][j]
是回文子串的条件为 [i+1,j-1]
回文,且 s[i] == s[j]
;
边界情况:
- i == j
时,一定回文,f[i][j] = true
;
- i + 1 == j
时,当且仅当 s[i] == s[j]
时回文;
故:
- i == j
, f[i][j] = true
;
- i + 1 == j
, f[i][j] = s[i] == s[j]
;
- 其他,f[i][j] = f[i+1][j-1] && s[i] == s[j]
;
注意状态转移时,当前状态 i,j 取决于 i + 1, j - 1,故代码的中 i 需要递减遍历;
#include<iostream>
using namespace std;
const int N = 1e3 + 7;
string s;
int f[N][N];
int main() {
getline(cin, s);
int n = s.size();
int ans = 0;
for (int i = n - 1; i >= 0; --i) {
for (int j = i; j < n; ++j) {
if (i == j) f[i][j] = 1;
else if (i+1 == j) f[i][j] = s[i] == s[j];
else f[i][j] = f[i+1][j-1] && s[i] == s[j];
if (f[i][j]) {
ans = max(ans, j - i + 1);
}
}
}
cout << ans;
return 0;
}