|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
题目描述:
- 我们给出 S,一个源于 {'D', 'I'} 的长度为 n 的字符串 。(这些字母代表 “减少” 和 “增加”。)
- 有效排列 是对整数 {0, 1, ..., n} 的一个排列 P[0], P[1], ..., P[n],使得对所有的 i:
- 如果 S[i] == 'D',那么 P[i] > P[i+1],以及;
- 如果 S[i] == 'I',那么 P[i] < P[i+1]。
- 有多少个有效排列?因为答案可能很大,所以请返回你的答案模 10^9 + 7.
-  
- 示例:
- 输入:"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)
-  
- 提示:
- 1 <= S.length <= 200
- S 仅由集合 {'D', 'I'} 中的字符组成。
-  
- 来源:力扣(LeetCode)
- 链接:https://leetcode-cn.com/problems/valid-permutations-for-di-sequence
- 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
复制代码
- class Solution {
- private:
- int mod = 1e9+7;
- public:
- int numPermsDISequence(string S) {
- int n = S.size();
- vector<vector<int> > dp(n + 1, vector<int>(n + 1, 0));
- dp[0][0] = 1;
- for(int i = 1; i <= n; i++){
- for(int j = 0; j <= i; j++){
- if(S[i-1] == 'D'){
- for(int k = j; k < i; k++){
- dp[i][j] += dp[i-1][k] ;
- dp[i][j] = dp[i][j]%mod;
- }
- }else{
- for(int k = 0; k < j; k++){
- dp[i][j] += dp[i-1][k];
- dp[i][j] = dp[i][j]%mod;
- }
- }
- }
- }
- int ans = 0;
- for(int j = 0; j <= n; j++){
- ans += dp[n][j];
- ans = ans % mod;
- }
- return ans;
- }
- };
复制代码
参考链接:https://leetcode-cn.com/problems ... a-jie-fa-by-mo-mo-/ |
|