1. 题目
2. 解答
我们定义状态 state[i][j] 表示子串 s[i, j] 是否为回文子串,如果 s[i, j] 为回文子串,并且有 s[i-1] == s[j+1],那么 s[i-1, j+1] 也为回文子串。状态转移方程为:
[state[i][j] = 1 space 如果 space i = j
]
[state[i][j] = egin{cases}
state[i+1][j-1] & ext{如果 } s[i] == s[j] \
0 & ext{如果 } s[i] != s[j]
end{cases}]
注意我们需要自底向上更新状态,首先是长度为 1 的子串,再然后是长度为 2 的,一直递增下去。
string longestPalindrome(string s) {
int n = s.size();
if (n == 0) return s;
vector<bool> temp(n, true);
vector< vector<bool>> state(n, temp);
int max_len = 1;
int begin = 0;
int end = 0;
// 坐标差从 1 开始,也即长度为 2
for (int len = 1; len < n; len++)
{
for (int i = 0; i < n-len; i++)
{
int j = i + len;
if (s[i] == s[j])
state[i][j] = state[i+1][j-1];
else state[i][j] = false;
if (state[i][j])
{
if (j - i + 1 > max_len)
{
max_len = j - i + 1;
begin = i;
end = j;
}
}
}
}
string ret(s.begin()+begin, s.begin()+end+1);
return ret;
}
获取更多精彩,请关注「seniusen」!