5.最长回文子串
(1) 暴力解法(超时)
class Solution {
public:
bool check(string s)
{
int i=0,j=s.size()-1;
while(i<s.size()/2)
{
if(s[i]!=s[j])
{
return false;
}
i++;
j--;
}
return true;
}
string longestPalindrome(string s) {
string str,res="";
for(int i=0;i<s.size();i++)
{
//cout<<"%%%"<<s[i]<<endl;
for(int j=1;j<s.size()-i+1;j++)
{
str=s.substr(i,j);
//cout<<"@@@"<<str<<endl;
if(check(str)&&str.length()>res.length())
{
res=str;
}
}
}
return res;
}
};
(2) 动态规划法(见leetcode)
class Solution {
public:
string longestPalindrome(string s) {
int n = s.size();
if (n < 2)
{
return s;
}
int maxlen = 1, begin = 0;//分别记录最长回文字串长度和起始位置
vector<vector<bool>> dp(n, vector<bool>(n, 0));//记录各个字串是否为回文
//判断长度为1和2子串的dp
dp[n - 1][n - 1] = 1;
for (int i = 0; i < n-1; i++)
{
dp[i][i] = 1;
if (s[i] == s[i + 1])
{
dp[i][i + 1] = 1;
if (maxlen < 2)
{
maxlen = 2;
begin = i;
}
}
else
{
dp[i][i + 1] = 0;
}
}
//判断长度大于2的子串是否为回文
for (int dist = 2; dist < n; dist++)//长度(dist+1)不断递增
{
for (int i = 0; i +dist < n; i++)
{
if (dp[i+1][i+dist-1]&&s[i] == s[i + dist])
{
dp[i][i + dist] = 1;
if (maxlen < dist + 1)
{
begin = i;
maxlen = dist + 1;
}
}
else
{
dp[i][i + dist] = 0;
}
}
}
return s.substr(begin, maxlen);
}
};
曾写出的bug总结:动态规划要先判断短的,再判断长的,而不是i,j双循环,而且长度的遍历要在外层!!!
vector<int> list1;
默认初始化
vector<int> ilist5(7,3);
指定值初始化,ilist5被初始化为包含7个值为3的int;
vector<int> list1(list.begin()+2,list.end()-1);
初始化为两个迭代器指定范围中元素的拷贝
string substr (size_t pos = 0, size_t len = npos) const;
获得某字符串子串,参数为起始位置和子串长度
(3) 中心扩展法
class Solution {
public:
string longestPalindrome(string s) {
int maxlen=0,begin=0;
for(int i=0;i<s.size();i++)
{
int left=i,right=i;
while(left>=0&&s[left]==s[i])
{
left--;
}
while(right<s.size()&&s[right]==s[i])
{
right++;
}
while(left>=0&&right<s.size()&&s[left]==s[right])
{
left--;
right++;
}
if(maxlen<right-left-1)
{
maxlen=right-left-1;
begin=left+1;
}
}
return s.substr(begin,maxlen);
}
};