string longestPalindrome(string str){
int *str_len=new int[str.size()];
int *index=new int[str.size()];
for(int i = 0;i < str.size();i++) {
str_len[i]=i>0&&str[i]==str[i-1]?str_len[i-1]+1:1;
index[str_len[i]]=i-str_len[i]+1;
if(i-str_len[i-1]-1>=0)
{
str_len[i]=str[i]==str[i-str_len[i-1]-1]?str_len[i-1]+2:str_len[i];
index[str_len[i]]=i-str_len[i]+1;
}
}
int res=0;
for(int i = 0;i ' ');
for(int i=0;i
不能简单地将 index[str_len[i]]=i-str_len[i]+1; 覆盖之前存储在 index 数组中的值
你需要将这些值存储在一个链表中,以便在最后构造最长回文子串时正确地找到对应的起始下标。
string longestPalindrome(string str) {
int *str_len = new int[str.size()];
vector<int> *index = new vector<int>[str.size()];
for (int i = 0; i < str.size(); i++) {
str_len[i] = i > 0 && str[i] == str[i - 1] ? str_len[i - 1] + 1 : 1;
index[str_len[i]].push_back(i - str_len[i] + 1);
if (i - str_len[i - 1] - 1 >= 0) {
str_len[i] = str[i] == str[i - str_len[i - 1] - 1] ? str_len[i - 1] + 2 : str_len[i];
index[str_len[i]].push_back(i - str_len[i] + 1);
}
}
int res = 0;
for (int i = 0; i < str.size(); i++) {
res = max(res, str_len[i]);
}
string s(res, ' ');
for (int i = 0; i < index[res].size(); i++) {
for (int j = 0; j < res; j++) {
s[j] = str[index[res][i] + j];
}
if (s == string(s.rbegin(), s.rend())) {
delete[] index;
delete[] str_len;
return s;
}
}
delete[] index;
delete[] str_len;
return "";
}
这段代码中可能导致内存溢出的原因是使用了动态内存分配,但没有及时释放。在函数末尾,需要使用delete[]释放str_len和index指向的内存空间。
正确的代码如下:
string longestPalindrome(string str){
int *str_len=new int[str.size()];
int *index=new int[str.size()];
for(int i = 0;i < str.size();i++) {
str_len[i]=i>0&&str[i]==str[i-1]?str_len[i-1]+1:1;
index[str_len[i]]=i-str_len[i]+1;
if(i-str_len[i-1]-1>=0)
{
str_len[i]=str[i]==str[i-str_len[i-1]-1]?str_len[i-1]+2:str_len[i];
index[str_len[i]]=i-str_len[i]+1;
}
}
int res=0;
for(int i = 0;i < str.size();i++) {
res=max(res,str_len[i]);
}
string s(res,' ');
for(int i=0;i<res;i++){
s[i]=str[index[res]++];
}
delete[] index;
delete[] str_len;
return s;
};