Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000.
Example:
Input: "babad" Output: "bab" Note: "aba" is also a valid answer.
Example:
Input: "cbbd" Output: "bb"
含有最XX的,典型动态规划题,最先想到的
时间O(n²),空间O(n²):
class Solution {
public:
string longestPalindrome(string s) {
if(s.size()<=1) return s;
int max_len=0;
vector<vector<int>> dp(s.size(),vector<int>(s.size()));
for(int i=1;i<s.size();i++){
for(int j=i;j>=0;j--){
if(s[i]==s[j]&&(i-j<=2||dp[i-1][j+1])){ //i j位置相邻与不相邻的情况
dp[i][j]=1;
m[i-j+1]=s.substr(j,i-j+1);
max_len=max(max_len,i-j+1);
}
}
}
return m[max_len];
}
private:
unordered_map<int,string> m;
};
这里用到unordered_map和substr函数,刚开始刷leetcode的同学可能不熟悉,多查一查就明白了,使用起来很方便
然后想是否可以优化呢,时间O(n²),空间O(1)的中心扩散法:
class Solution {
public:
string longestPalindrome(string s) {
if(s.size()<=1) return s;
int max_len=0;
int start=0;
for(int i=0;i<s.size();i++){
int j=i,k=i; //定位中心
while(k<s.size()-1&&s[k]==s[k+1]) //相等的情况
k++;
while(j>0&&k<s.size()-1&&s[j-1]==s[k+1]){ //两边扩散
j--;
k++;
}
if(k-j+1>max_len){
max_len=k-j+1;
start=j;
}
}
return s.substr(start,max_len);
}
};
但是O(n²)的时间复杂度还是挺大的,去网上搜了一下,附上解法: