给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
示例 1:
输入: “babad” 输出: “bab” 注意: “aba” 也是一个有效答案。 示例 2:
输入: “cbbd” 输出: “bb”
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-palindromic-substring
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
遍历一遍,找奇偶最长 28ms
class Solution {
public:
string longestPalindrome(string s) {
int len = s.length();
int maxindex=0,maxlen=1;
for (int i = 0; i < len - 1; i++) {
int temp1=0, temp2=1;
int j = 1;
while (i - j+1 >= 0 && i + j < len&&s[i - j + 1] == s[i + j]) {
j++;
temp1 += 2;
}
j = 1;
while (i - j >= 0 && i + j < len&& s[i - j] == s[i + j]) {
j++;
temp2 += 2;
}
if (temp1> maxlen|| temp2> maxlen) {
maxlen = max(temp1, temp2);
maxindex = i;
}
}
return s.substr(maxindex-(maxlen-1)/2,maxlen);
}
};
动态规划488 ms
//3 dp
class Solution {
public:
string longestPalindrome(string s) {
int len = s.length();
if (len == 0 || len == 1) {
return s;
}
int start = 0, end = 0;
vector<vector<bool> > dp(len, vector<bool>(len,false));
for (int i = 0; i < len; i++) {
dp[i][i] = true;
//cout << dp[i][i] << endl;
if ((i +1 <len ) && s[i] == s[i+1]) {
dp[i][i+1] = true;
//cout << dp[i][i + 1] << endl;
if (1> end - start) {
start = i;
end = i+1;
}
}
}
for (int j =2; j < len; j++) {
for (int i = 0; i < len-1; i++) {
if ((dp[i + 1][j - 1]) && s[i] == s[j]) {
dp[i][j] = true;
if (j - i > end - start) {
start = i;
end = j;
}
}
}
}
return s.substr(start, end - start + 1);
}
};