列表

详情


BM73. 最长回文子串

描述

对于长度为n的一个字符串A(仅包含数字,大小写英文字母),请设计一个高效算法,计算其中最长回文子串的长度。


数据范围:
要求:空间复杂度 ,时间复杂度
进阶:  空间复杂度 ,时间复杂度

示例1

输入:

"ababc"

输出:

3

说明:

最长的回文子串为"aba"与"bab",长度都为3

示例2

输入:

"abbba"

输出:

5

示例3

输入:

"b"

输出:

1

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++ 解法, 执行用时: 2ms, 内存消耗: 416KB, 提交时间: 2022-02-09

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param A string字符串 
     * @return int整型
     */
    pair<int,int> checkPalidrome(const string &A,int left,int right){
        while(left>=0&&right<A.size()&&A[left]==A[right]){
                --left,++right;
        }
        return {left+1,right-1};
    }
    int getLongestPalindrome(string A) {
        int start=0,end=0;
        // write code here
        int n_size=A.size();
        for(int i=0;i<n_size;i++){
            auto [l,r]=checkPalidrome(A, i, i);
            if(r-l>end-start){
                end=r,start=l;
            }
            auto [l1,r1]=checkPalidrome(A, i, i+1);
            if(r1-l1>end-start){
                end=r1,start=l1;
            }
        }
        return end-start+1;
    }
};

C++ 解法, 执行用时: 2ms, 内存消耗: 428KB, 提交时间: 2021-12-08

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param A string字符串 
     * @return int整型
     */
    int getLongestPalindrome(string A) {
        // write code here
        int res = 0, step;
        for (int i = 0; i < A.size(); i += step)
        {
            int l = i - 1, r = i + 1;
            step = 1;
            while (r < A.size() && A[i] == A[r])
            {
                ++r;
                ++step;
            }
            while (l >= 0 && r < A.size() && A[l] == A[r])
            {
                ++r;
                --l;
            }
            res = max(res, r-l-1);
        }
        return res;
    }
};

C 解法, 执行用时: 2ms, 内存消耗: 540KB, 提交时间: 2021-11-12

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param A string字符串 
 * @param n int整型 
 * @return int整型
 *
 * C语言声明定义全局变量请加上static,防止重复定义
 */
int getLongestPalindrome(char* A, int n ) {
    // write code here
    int left,right;
    int len=0;
    int step;
    if(n==0)
        return 0;
    for(int i=0;i<n;i=i+step)
    {
        step=1;
        left=i-1;
        right=i+1;
        while(A[right]!='\0'&&A[right]==A[i])
        {
            right++;
            step++;
        }
        while(left>=0 && A[right]!='\0'&&A[left]==A[right])
        {
            left--;
            right++;
        }
        if(right-left-1>len)
            len=right-left-1;
    }
    return len;
}

C++ 解法, 执行用时: 3ms, 内存消耗: 396KB, 提交时间: 2022-01-16

class Solution{
public:
    int getLongestPalindrome(string A) {
        // write code here
        if(A.size()==0||A.size()==1)
            return A.size();
        int max_lens=1;
        for(int i=0;i<A.size();i++)
            {
                int j=i,k=i+1;
                while(j>=0&&k<A.size()&&A[j]==A[k])
                {
                    if(k-j+1>max_lens)
                    {
                        max_lens=k-j+1;
                    }
                    j--;
                    k++;
                }
            }
         for(int i=0;i<A.size();i++)
            {
                int j=i-1,k=i+1;
                while(j>=0&&k<A.size()&&A[j]==A[k])
                {
                    if(k-j+1>max_lens)
                    {
                        max_lens=k-j+1;
                    }
                    j--;
                    k++;
                }
            }
        return max_lens;
    }
};

C++ 解法, 执行用时: 3ms, 内存消耗: 396KB, 提交时间: 2021-12-11

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param A string字符串 
     * @return int整型
     */
    int getLongestPalindrome(string A) {
        // write code here
        int res=0;
        int len=A.size();
        int i=0;
        //for(int i=0;i<len;i++)
        while(i<len)
        {
            int left=i;
            int right=i;
            
            if(len-i<res/2) break;
            
            while(right<len && A[right]==A[right+1])
            {
                right++;
            }
            
            i=right+1;
            
            while(left>=1 &&right<len && A[left-1]==A[right+1])
            {
                left--;
                right++;
            }
            res=max(res,right-left+1);
        }
        return res;
    }
};

上一题