class Solution {
public:
string longestPalindrome(string s) {
int slen = s.size();
int smax = 1;
//第一次忘记给begin给初始值了,若字符串为ac则begin会出错
int begin = 0;
//注意这里的vector的构造方式
vector<vector<int>> dp(slen,vector<int>(slen));
//初始化dp二维向量
for(int i = 0;i < slen;i ++)dp[i][i] = 1;
if(slen < 2)return s;
//L为字串长度,i为左边界,j为右边界
for(int L = 2;L <= slen; L ++){
for(int i = 0;i < slen;i ++){
int j = i + L - 1;
if(j >= slen)break;
if(s[i] != s[j])dp[i][j] = 0;
else{
if(j - i < 3)dp[i][j] = 1;
else dp[i][j] = dp[i + 1][j - 1];
}
if(dp[i][j] == 1 && j - i + 1 > smax){
smax = j - i + 1;
begin = i;
}
}
}
// printf("%d %d\n",begin,smax);
return s.substr(begin,smax);
}
};
"""
dp[][]的理解:dp[i][j]是指i到j的字符串是否为回文,
dp[i][j] = dp[i+1][j-1] & (s[i] == s[j])
循环的时候,从长度循环
这里用二维向量来代替二维数组有时候更方便
注意二维向量的构造:vector<vector<int>> dp(slen,vector<int>(slen))
注意括号里的两个参数,创建一个slen行和slen列的二维向量dp,并且每一行的初始值都是一个包含slen个默认初始化(对于int类型,默认初始化为0)的元素的vector<int>。
"""
leetcode5
于 2024-03-11 13:31:39 首次发布