slt

先来看看暴力破解的时间复杂度。

首先,n 个元素的 set 有 sub-set 个数为:$2^n$ n 个元素的 sub-sequence 个数也是 $2^n$。因为集合是无序的,我们取 sub-set 中按原来顺序排的个数,和集合中随变排的个数,这两个个数是一样的。

所以,暴力破解一般是不行的。遇到 sub-sequence 的问题一般要想到 DP

顺便,看看长度为 n 的字符串的子串。这个就比较简单了,长度为 1 的有 n 个,长度为 n 的有 n-1 个,...,长度为 n - 1 的有 2 个,长度为 n 的有一个。所以即是求 $$

$ \sum\limits_{i=1}^{n} = n * (n-1) / 2 $

Solution1 DP

  • 时间复杂度 $O(n^2)$

  • 空间复杂度 $O(n^2)$

  • 状态 f[i][j] 表示 s 的第 i 个字符到第 j 个字符组成的子串中,最长的回文序列长度是多少

  • 转移方程 如果 s 的第 i 个字符和第 j 个字符相同的话,则有 f[i][j] = f[i+1][j-1] + 2 如果 s 的第 i 个字符和第 j 个字符不同的话,f[i][j] = max(f[i+1][j], f[i][j-1]) 遍历顺序:i 从后往前,j 从 i+1 往后。

  • 初始化 f[i][i] = 1

  • 结果 f[0][N-1]

Last updated