903. DI 序列的有效排列
题目描述
给定一个长度为 n
的字符串 s
,其中 s[i]
是:
“D”
意味着减少,或者“I”
意味着增加
有效排列 是对有 n + 1
个在 [0, n]
范围内的整数的一个排列 perm
,使得对所有的 i
:
- 如果
s[i] == 'D'
,那么perm[i] > perm[i+1]
,以及; - 如果
s[i] == 'I'
,那么perm[i] < perm[i+1]
。
返回 有效排列 perm
的数量 。因为答案可能很大,所以请返回你的答案对 109 + 7
取余。
示例 1:
输入:s = "DID" 输出:5 解释: (0, 1, 2, 3) 的五个有效排列是: (1, 0, 3, 2) (2, 0, 3, 1) (2, 1, 3, 0) (3, 0, 2, 1) (3, 1, 2, 0)
示例 2:
输入: s = "D" 输出: 1
提示:
n == s.length
1 <= n <= 200
s[i]
不是'I'
就是'D'
解法
方法一:动态规划
我们定义 \(f[i][j]\) 表示字符串的前 \(i\) 个字符中,以数字 \(j\) 结尾的满足题目要求的排列的数量。初始时 \(f[0][0]=1\),其余 \(f[0][j]=0\)。答案为 \(\sum_{j=0}^n f[n][j]\)。
考虑 \(f[i][j]\),其中 \(j \in [0, i]\)。
如果第 \(i\) 个字符 \(s[i-1]\) 是 'D'
,那么 \(f[i][j]\) 可以从 \(f[i-1][k]\) 转移而来,其中 \(k \in [j+1, i]\),而由于 \(k-1\) 最大只能为 \(i-1\),我们将 \(k\) 向左移动一位,那么 \(k \in [j, i-1]\),因此有 \(f[i][j] = \sum_{k=j}^{i-1} f[i-1][k]\)。
如果第 \(i\) 个字符 \(s[i-1]\) 是 'I'
,那么 \(f[i][j]\) 可以从 \(f[i-1][k]\) 转移而来,其中 \(k \in [0, j-1]\),因此有 \(f[i][j] = \sum_{k=0}^{j-1} f[i-1][k]\)。
最终的答案即为 \(\sum_{j=0}^n f[n][j]\)。
时间复杂度 \(O(n^3)\),空间复杂度 \(O(n^2)\)。其中 \(n\) 是字符串的长度。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
|
我们可以用前缀和优化时间复杂度,使得时间复杂度降低到 \(O(n^2)\)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
|
另外,我们也可以用滚动数组优化空间复杂度,使得空间复杂度降低到 \(O(n)\)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
|