算法学习打卡计划

leetcode:第5题

2022-10-04  本文已影响0人  皮克斯不爱吃糖

题目

给你一个字符串 s,找到 s 中最长的回文子串。

例1:

输入:s = "babad"
输出:"bab"
解释:"aba" 同样是符合题意的答案。

例2

输入:s = "cbbd"
输出:"bb"

提示

1 <= s.length <= 1000
s 仅由数字和英文字母组成

代码

class Solution {
public:
    string longestPalindrome(string s) {
        int len=s.size();
        if(len==0||len==1)
            return s;
        int start=0;
        int max=1;
        vector<vector<int>>  dp(len,vector<int>(len));
        for(int i=0;i<len;i++)
        {
            dp[i][i]=1;
            if(i<len-1&&s[i]==s[i+1])
            {
                dp[i][i+1]=1;
                max=2;
                start=i;
            }
        }
        for(int l=3;l<=len;l++)
        {
            for(int i=0;i+l-1<len;i++)
            {
                int j=l+i-1;
                if(s[i]==s[j]&&dp[i+1][j-1]==1)
                {
                    dp[i][j]=1;
                    start=i;
                    max=l;
                }
            }
        }
        return s.substr(start,max);
    }
};

思路

在做的几组测试中,尝试过几种方法,均可实现。一是直接使用二分查找对比,此处注意区分字符串长度的奇偶情况,分开讨论;二是将字符串s先反转,再复制为一个新的字符串new_s,再进行对比两个字符串二分之一长度的字符是否相同,同样需要区分字符串长度的奇偶情况。

上一篇下一篇

猜你喜欢

热点阅读