leetcode 5. 最长回文子串(c++)

题目

在这里插入图片描述

思路分析

  1. 中心扩向两边的思想,根据回文串的性质,如str = "aba",从b出发,往两边同时遍历并比较字符是否相同即可,令left = i - 1,right = i + 1,那么依次比较str[left] == str[right]是否成立。如成立,继续比较,若不成立,则结束此次迭代,并进行i ++下一次比较。该方法的最大时间复杂度为O(n^2).
  2. 动态规划的思想,该方法由小到大、由短到长进行判断是否是回文串(对于单个字符都默认为回文串,即长度为1,该性质也作为初始化dp数组的条件(dp[i][j]表示下标从ij的子字符串),即dp[i][j]=true)。那么后续的判断都在该基础上进行。如判断dp[i][i + len - 1]回文串true or false,只需判断s[i] == s[i + len - 1]是否成立,若成立,则dp[i][i + len - 1] = dp[i + 1][i + len - 2] ,否则dp[i][i + len - 1] = false 。当然,其中存在一个细节问题,请看代码实现。

题解1

class Solution {
    
    
public:
    string longestPalindrome(string s) {
    
    
        int left, right;
        string max_str = "", cur_str = "";
        for(int i = 0;i < s.length(); ++i){
    
    
            left = i - 1, right = i + 1;
            cur_str = s[i];
            for(int j = right; right < s.length(); ++j){
    
    
                if(s[i] == s[j])
                    cur_str += s[j];
                else{
    
    
                    right = j;
                    break;
                }
            }
            while(left >= 0 && right < s.length()){
    
    
                if(s[left] == s[right])
                    cur_str = s[left] + cur_str + s[right];
                else
                    break;
                left --;
                right ++;
            }
            max_str = (max_str.size() < cur_str.size() ? cur_str : max_str);
            if (s.length() - i < max_str.size() / 2)
                break;
        }
        return max_str;
    }
};

提交结果
在这里插入图片描述

题解2

class Solution {
    
    
public:
    string longestPalindrome(string s) {
    
    
        if(s.size() <= 1)
            return s;
        // Construct dp [i] [j] to indicate whether the substring of the subscripts i to j of the string is a palindrome string
        vector<vector<int>> dp(s.size(), vector<int>(s.size()));
        int start = 0, end = 0;
        // A single character is a palindrome string
        for(int i = 0;i < s.size(); ++i) 
            dp[i][i] = true;
        // Traverse from a minimum length of 2
        for(int len = 2; len <= s.size(); ++len){
    
    
            for(int i = 0; i < s.size() - len + 1; ++i){
    
    
                // Unequal first and last characters
                if(s[i] != s[i + len - 1])
                    dp[i][i + len - 1] = false;
                else{
    
    
                    if (len <= 2)
                        dp[i][i + len - 1] = true;
                    // Determine whether the included string is a palindrome string
                    else 
                        dp[i][i + len - 1] = dp[i + 1][i + len - 2];
                }
                // Update the beginning and end positions of the maximum palindrome string
                 if (dp[i][i + len - 1] && len >= end - start + 1){
    
    
                    start = i;
                    end = i + len - 1;
                 }
            }
        }
        return s.substr(start, end - start + 1);
    }
};

提交结果
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_44116998/article/details/130465264
今日推荐