在 leetcode 上解决最长回文子串问题时,我发现在我的两个相同的解决方案中,使用动态分配的一个最多使用 244mb 的 RAM,而另一个只使用 10mb 的 RAM。
静态分配方案(动态方案在代码评论区)
char * longestPalindrome(char * s){
int n = strlen(s);
int ps[n][n]; //int *ps = (int *)malloc(n * n * sizeof(int));
memset(ps, 0, sizeof(ps[0][0]) * n * n);
int maxi = 0, maxj = 0;
for (int i = 0; i < n; i++)
{
ps[i][i] = 1; //ps[i*n+i] = 1;
}
for (int l = 2; l <= n; l++)
{
for (int i = 0; i <= n - l; i++)
{
int j = i + l - 1;
if (i == j - 1)
{
if (ps[i][j] = (s[i] == s[j])) //if (ps[i*n+j] = (s[i] == s[j]))
{
maxi = i;
maxj = j;
}
}
else
{
if (ps[i][j] = (s[i] == s[j] && ps[i + 1][j - 1])) //if (ps[i*n+j] = (s[i] == s[j] && ps[(i + 1)*n+(j - 1)]))
{
maxi = i;
maxj = j;
}
}
}
} //free(ps)
char *p = &s[maxi];
s[maxj + 1] = '\0';
return p;
}
您正在堆栈上分配
ps
。如果这在 leetcode 中确实有效,那么显然 leetcode 都允许使用其自己的非常大的堆栈分配来避免崩溃,并且 leetcode 不会将其计为内存使用。简而言之,您似乎在以一种不允许的方式欺骗 leetcode。 244 MB 是一个离谱的堆栈大小。 C 编译器的典型默认堆栈大小为 8 MB。