class Solution {
public:
string longestPalindrome(string s) {
if (s.empty()) return "";
int sLen = s.size();
if (sLen == 1) return s;
int maxLen = 0;
int start = 0;
string ans = "";
vector<vector<int> > dp(s.size(), vector<int>(s.size(), 0));
for (int i = 0; i < sLen; i++) {
dp[i][i] = 1;
maxLen = 1;
start = 0;
}
// i最小 i==1 因为是和之前的值进行比较,这一点是必须要保证的,不然会越界
for (int i = sLen - 1; i > 0; i--) {
if (s[i-1] == s[i]) {
dp[i-1][i] = 1;
dp[i][i-1] = 1;
maxLen = 2;
start = i-1; // 更新以 i-1进行更新
}
}
// 主要是利用二维数组保持中间的结果, 后面进行的运算以来前面的结果
// 在字符串[j, k]要判断s[j] 是否等于s[k], 以及之前的运算结果dp[j+1, k+1]是不是回文的
// 如果是的话 就进行更新
for (int k = 2; k < sLen; k++) {
for (int j = 0; j < k; j++) {
if (k - j >= 2 && s[j] == s[k] && dp[j+1][k-1] == 1) {
dp[j][k] = 1;
if (k-j+1 > maxLen) {
maxLen = k-j+1;
start = j;
}
}
}
}
ans = s.substr(start, maxLen);
return ans;
}
};
最长回文子串 leetcode5
最新推荐文章于 2020-04-10 18:10:56 发布