Leetcode第5号问题
只能通过62个测试
后面就越界了
class Solution {
public:
string longestPalindrome(string s) {
int n = s.size();
//特殊值处理
if(n<2) return s;
if(n==2){
if(s[0]==s[1]) return s;
else return s.substr(0,1);
}
//初始化dp数组
vector<vector<bool>> dp(n,vector<bool>(n));
//先填对角线为true
for(int i=0;i<n;i++){
dp[i][i]=true;
}
//记录是回文字符的起始值start和长度len
int start = 0;
int len = 0;
//再填对角线上方,通过i和i+1判断
for(int i=0;i<n;i++){
if(s[i]==s[i+1]){
dp[i][i+1]=true;
start = i;
len = 2;
}else{
dp[i][i+1]=false;
}
}
//现在根据dp数组左下角,按列由上到下逐渐更新完dp
for(int j=2;j<n;j++){
for(int i=0;i<j-1;i++){
if((s[i]==s[j]) && (dp[i+1][j-1]==true)){
dp[i][j]=true;
if(j-i+1 > len){
start = i;
len = j-i+1;
}
}else{
dp[i][j]=false;
}
}
}
//如果最后len还没更新,就返回第一个
if(len==0) return s.substr(0,1);
return s.substr(start,len);
}
};
嗯…越界一般都是for循环while循环有问题,一查,果然一个for循环越界,改为 for(int i=0;i<n-1;i++)即可
class Solution {
public:
string longestPalindrome(string s) {
int n = s.size();
//特殊值处理
if(n<2) return s;
if(n==2){
if(s[0]==s[1]) return s;
else return s.substr(0,1);
}
//初始化dp数组
vector<vector<bool>> dp(n,vector<bool>(n));
//先填对角线为true
for(int i=0;i<n;i++){
dp[i][i]=true;
}
//记录是回文字符的起始值start和长度len
int start = 0;
int len = 0;
//再填对角线上方,通过i和i+1判断
for(int i=0;i<n-1;i++){
if(s[i]==s[i+1]){
dp[i][i+1]=true;
start = i;
len = 2;
}else{
dp[i][i+1]=false;
}
}
//现在根据dp数组左下角,按列由上到下逐渐更新完dp
for(int j=2;j<n;j++){
for(int i=0;i<j-1;i++){
if((s[i]==s[j]) && (dp[i+1][j-1]==true)){
dp[i][j]=true;
if(j-i+1 > len){
start = i;
len = j-i+1;
}
}else{
dp[i][j]=false;
}
}
}
//如果最后len还没更新,就返回第一个
if(len==0) return s.substr(0,1);
return s.substr(start,len);
}
};