好!!这不是功课! 我的问题是"给定一个字符串S,找到S中最长的回文子字符串。您可以假设S的最大长度为1000,并且存在一个唯一的最长的回文子字符串。"常规方式是O(n * n)并且通过使用动态编程我得到了一个更好的方法,这与下面的程序非常相似。 据我所知,O(n)和O(2n)可以被认为是相同的。那么O(n * n / 2)仍然等于O(n * n)?
这里是代码:
for(int i =0; i < n; i++)
{
for(int j = 0; j< i; j++)
{
if (array[i][j] != 0)
array[i][j] = -1;
}
}
答案 0 :(得分:-1)
虽然老实说这看起来像是一个家庭作业问题,但无论如何我都会回答它,希望我能帮助解释它:
首先,你有一个嵌套循环。通常,如果每个循环的最大值与n相关,则嵌套循环通常具有时间复杂度O(n 2 )。
在你的情况下,我会把它分解成一个视觉表示,希望它有意义:
想象一个宽度和高度为n的正方形(第一个/外部循环的最大值)。在这种情况下,我会选择n = 5:
o o o o o
o o o o o
o o o o o
o o o o o
o o o o o
现在,使用此方块,您可以将每行映像为i的一次迭代,而每列将代表您的j索引以及您到达的距离。当我们在我们的算法中标记将要访问的表中的哪个o时,我们将看到一个整洁的模式。
如果您自己单步执行,那么当您完成时,您将看到以下结果:
o o o o o
x o o o o
x x o o o
x x x o o
x x x x o
从这里我们可以看到已经访问了大约一半的广场。由于我们知道正方形的面积为n 2 ,我们可以说我们访问了n 2 / 2的正方形部分。因此,运行时间也是O(n 2 / 2),然后减少到O(n 2 ),因为系数可以忽略。