5. Longest Palindromic Substring

来源:互联网 发布:北京地铁网络取票机 编辑:程序博客网 时间:2024/06/03 12:55

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²)的时间复杂度还是挺大的,去网上搜了一下,附上解法:

manacher

原创粉丝点击