0
点赞
收藏
分享

微信扫一扫

(leetcode 字符串处理/动态规划)最长回文子串

北邮郭大宝 2022-03-31 阅读 46
c++

解题方法(两种)

一、暴力求解

n^3时间复杂度

class Solution
{
public:
    string longestPalindrome(string s)
    {
        if(s.length()==0)
        {
            return "";
        }
        if(s.length()==1)
        {
            return s;
        }
        int start=0,maxlength=1;//记录最大回文子串的起始位置以及长度
        for(int i=0; i<s.length(); i++)
            for(int j=i+1; j<s.length(); j++) //从当前位置的下一个开始算
            {
                int temp1,temp2;
                for(temp1=i,temp2=j; temp1<temp2; temp1++,temp2--)
                {
                    if(s[temp1]!=s[temp2])
                        break;
                }
                if(temp1>=temp2 && j-i+1>maxlength)//这里要注意条件为temp1>=temp2,因为如果是偶数个字符,相邻的两个经上一步会出现大于的情况
                {
                    maxlength = j-i+1;
                    start=i;
                }
            }
        return s.substr(start,maxlength);//利用string中的substr函数来返回相应的子串,第一个参数是起始位置,第二个参数是字符个
    }
};

二、动态规划

dp[i][j]表示是否是回文子串

先将长度为0、1、2先考虑,再使用动态规划

 

C++中vector用法和dp(m, vector<int>(n) )_Alvin森的博客-CSDN博客

class Solution
{
public:
    string longestPalindrome(string s)
    {
        if (s.empty()) //0
            return "";
        int len = s.size();
        if (len == 1)   //1
            return s;
        int longest = 1;   //最长长度
        int start=0;   //起始位置
        vector<vector<int> > dp(len,vector<int>(len));  //初始化len个类型为vector<int>,并且vector<int>前len个初始化为0
        for (int i = 0; i < len; i++)
        {
            dp[i][i] = 1;   //自己到自己是回文子串
            if(i<len-1)  //防止数组下标越界
            {
                if (s[i] == s[i + 1])
                {
                    dp[i][i + 1] = 1;
                    start=i;
                    longest=2;
                }
            }
        }
        //如果长度大于等于3
        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;
                    longest = l;
                }
            }
        }
        return s.substr(start,longest);
    }
};

题目:

 

举报

相关推荐

0 条评论