地址:5. 最长回文子串

    状态:阅读题解,书写代码AC

    代码:
    动态规划:
    状态转移方程:
    5. 最长回文子串 - 图1

    1. class Solution {
    2. public:
    3. string longestPalindrome(string s) {
    4. if(s.size() <= 1) return s;
    5. int len = s.size();
    6. string ans;
    7. vector<vector<int>> dp(len, vector<int>(len));
    8. for(int l = 0;l<len;l++){
    9. for(int i = 0;i+l<len;i++){
    10. int j = i+l;
    11. if(l == 0) dp[i][j] = 1;
    12. else if(l == 1) {
    13. dp[i][j] = (s[i] == s[j]);
    14. }else{
    15. dp[i][j] = (s[i] == s[j]) && dp[i+1][j-1];
    16. }
    17. if(dp[i][j] && (l+1>ans.size())){
    18. ans = s.substr(i,l+1);
    19. }
    20. }
    21. }
    22. return ans;
    23. }
    24. };

    中心扩散:

    1. class Solution {
    2. public:
    3. string longestPalindrome(string s) {
    4. if (s == "")return "";
    5. int len = s.length();
    6. int index = 0,maxL=0,begin=0;
    7. while (index < len) {
    8. int right = index, left = index;
    9. while (index < len&&s[index + 1] == s[index]) {
    10. index++;
    11. right++;
    12. }
    13. while (right < len&&left >= 0 && s[right] == s[left]) {
    14. right++;
    15. left--;
    16. }
    17. right--, left++;
    18. if (right-left+ 1 > maxL) {
    19. maxL = right - left + 1;
    20. begin = left;
    21. }
    22. index++;
    23. }
    24. return s.substr(begin, maxL);
    25. }
    26. };