解题方法(两种)
一、暴力求解
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);
}
};
题目: