leetcode-903-Valid Permutations for DI Sequence
问题
We are given S
, a length n
string of characters from the set {'D', 'I'}
. (These letters stand for “decreasing” and “increasing”.)
A valid permutation is a permutation P[0], P[1], ..., P[n]
of integers {0, 1, ..., n}
, such that for all i
:
- If
S[i] == 'D'
, thenP[i] > P[i+1]
, and; - If
S[i] == 'I'
, thenP[i] < P[i+1]
.
How many valid permutations are there? Since the answer may be large, return your answer modulo 10^9 + 7
.
Example 1:
1 | Input: "DID" |
Note:
1 <= S.length <= 200
S
consists only of characters from the set{'D', 'I'}
.
分析
思路1:
dp[i][j]
表示 “由 i+1 个数字组成且第 i+1 个数字(即序列中的最后一个数字)是剩余数字中(包括当前数字)中第 j+1 小的数字” 时的有效序列个数。比如 dp[0][0]
表示序列只有1个数字,且该数字是生育数字中最小的,那就只能是0,所以 dp[0][0] == 1
。
状态转移方程:
1 | if (S[i] == 'D') dp[i+1][j] = sum(dp[i][k]) ( j < k <= n-1 ) |
S[i] == 'D'
表示下标为 i+1
的数要比下标为 i
的数小。也就是说第 i+2
个数要比第 i+1
个数小。则可以来确定 dp[i+1][j]
的值。dp[i+1][j]
表示第 i+2
个数是剩下没有选择的元素中(包括当前数字)第 j
小的。dp[i+1][j]
的值就决定于 dp[i][k]
(k > j)。同理,当 S[i] == 'I'
时,表示下标为 i+1
的数要比下标为 i
的数大。dp[i+1][j]
的值就决定于 dp[i][k]
(k <= j) ,注意这里可以取等号。当 k == j
时,在处理第 i+1
个数时,所取的数是第 j
小个,那么当其取走之后,在处理第 i+2
个数时,所取的当前剩余元素的第 j
小个时,所取的值也一定大于第 i+1
个数所取的值。
最终的答案在 dp[n][0]
思路2:
dp[i][j]
表示由范围 [0, i] 内的数字组成且最后一个数字为j的不同序列的个数。
1 | if (S[i] == 'D') dp[i+1][j] += dp[i][k] ( j <= k <= i ) |
https://www.cnblogs.com/grandyang/p/11094525.html
代码1
1 | class Solution { |
代码2
1 | class Solution { |
Author: Hatton.Liu
Link: http://hattonl.github.io/2020/04/03/leetcode-903/
License: 知识共享署名-非商业性使用 4.0 国际许可协议