在最坏的情况下,第一个玩家无法获胜,循环将经历所有迭代。把问题的大小n作为输入字符串中的脉冲数,我们得到一个运行时间T(n)=(n-1)T(n-2)=(n-1)(n-3)T(n-4)=…=O(n!!)。给你,n!!是双阶乘。这明显比指数更糟,这对于这个问题来说是相当可怕的。您可以使用动态规划来改进这个界限,如下所示:
Set<String, Boolean> canWinMap = new HashMap<>();
public boolean canWin(String s) {
if (canWinMap.hasKey(s)) {
return canWinMap.get(s);
}
for (int i = 0; i < s.length() - 1; ++i)
if (s.charAt(i) == '+' && s.charAt(i + 1) == '+' &&
!canWin(s.substring(0, i) + "--" + s.substring(i + 2)))
canWinMap.put(s, true);
return true;
canWinMap.put(s, false);
return false;
}
最坏的情况是以指数(可能乘以一个线性项)为界,因为只有O(2^n)个可能的字符串是从包含“+”和“-”的起始字符串派生出来的。在此之后,所有递归调用都是常量时间(摊销)。