2018/11/18

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', then P[i] > P[i+1], and;
  • If S[i] == 'I', then P[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:

Input: "DID"
Output: 5
Explanation:
The 5 valid permutations of (0, 1, 2, 3) are:
(1, 0, 3, 2)
(2, 0, 3, 1)
(2, 1, 3, 0)
(3, 0, 2, 1)
(3, 1, 2, 0)

Note:

  • 1 <= S.length <= 200
  • S consists only of characters from the set {'D', 'I'}.

问题分析:

本题难度为Hard!属于动态规划问题,已给出的函数定义为

class Solution:def numPermsDISequence(self, S):""":type S: str:rtype: int"""

本题可采取动态规划算法求解,思路来源于一个大佬给出了例子,这里首先分析这个例子:
对于上述的测试样例"DID",求数字{0,1,2,3}组成的序列的排列方式数量;有如下的分析图:

其中dp[i][j]表示从{0,1,2,3}中取i+1个数字时(即排列序列的前i+1个数),第i+1个数为剩余的数字中第j+1小的数字的排列方法数量。括号内为排列方式。

观察上图中的连线,可以总结规律:
当第i个数对应的字符为D时,dp[i+1][j]=dp[i][j+1]+dp[i][j+2]+...+dp[i][n-1-i]
当第i个数对应的字符为I时,dp[i+1][j]=dp[i][j]+dp[i][j-1]+...+dp[i][0]
i=0时,dp[i][j]=1

分析可以改善代码降低空间复杂度,代码实现如下;

代码实现:

class Solution:def numPermsDISequence(self, S):""":type S: str:rtype: int"""dp = [1] * (len(S) + 1)for c in S:if c == "I":dp = dp[:-1]for i in range(1, len(dp)):dp[i] += dp[i - 1]else:dp = dp[1:]for i in range(len(dp) - 1)[::-1]:dp[i] += dp[i + 1]return dp[0] % (10**9 + 7)

参考思路:[C++/Java/Python] DP Solution O(N^2)

LeetCode Problems 903相关推荐

  1. LeetCode Problems #935

    2018/11/11 935. Knight Dialer 问题描述: A chess knight can move as indicated in the chess diagram below: ...

  2. leetcode dfs_深度优先搜索:具有6个Leetcode示例的DFS图遍历指南

    leetcode dfs Have you ever solved a real-life maze? The approach that most of us take while solving ...

  3. LeetCode 1166. 设计文件系统(哈希map)

    文章目录 1. 题目 2. 解题 1. 题目 你需要设计一个能提供下面两个函数的文件系统: create(path, value): 创建一个新的路径,并尽可能将值 value 与路径 path 关联 ...

  4. LeetCode 1233. 删除子文件夹

    1. 题目 你是一位系统管理员,手里有一份文件夹列表 folder,你的任务是要删除该列表中的所有 子文件夹,并以 任意顺序 返回剩下的文件夹. 我们这样定义「子文件夹」: 如果文件夹 folder[ ...

  5. [LeetCode]小工具,统计数量,隐藏上锁的题目

    LeetCode Problems List没有统计数量的功能,顺手写了一个. 下面两段只是用jquery调整网页上显示的内容,刷新网页就没用了. 比如想看题目里一共有多少Easy, Medium和H ...

  6. 【Leetcode】精选算法top200道(二)

    二.中等 339.嵌套列表权重和 给定一个嵌套的整数列表 nestedList ,每个元素要么是整数,要么是列表.同时,列表中元素同样也可以是整数或者是另一个列表. 整数的 深度 是其在列表内部的嵌套 ...

  7. 好教程推荐系列:力扣LeetCode官网/labuladong的算法小抄/漫画算法小灰/刷题模板

    LeetCode官网 https://leetcode.com/ https://leetcode-cn.com/ labuladong的算法小抄 刷算法全靠套路,认准 labuladong 就够了! ...

  8. Leetcode 1233 删除子文件夹 (C++题解)

    你是一位系统管理员,手里有一份文件夹列表 folder,你的任务是要删除该列表中的所有 子文件夹,并以 任意顺序 返回剩下的文件夹. 我们这样定义「子文件夹」: 如果文件夹 folder[i] 位于另 ...

  9. Leetcode-How-What 力扣Leetcode刷题指南

    Leetcode-How-What 力扣Leetcode刷题指南 About the way how to use Leetcode wisely for preparing the intervie ...

  10. 力扣刷题心得(设计类题目)

    设计类题目基本考察的是你对现实事物的抽象能力,一般会遇到一些类的设计.字符串切分.集合的使用(list.map.set.stack.deque)等,结束后我会更新一些关于这些集合的常见使用方法和场景. ...

最新文章

  1. PHP中foreach详细解读
  2. 计算机应用基础win7作业3答案,电大: 国开计算机应用基础(WIN7)形成性考核册3答案.docx...
  3. 人,是否应该不要去好高骛远
  4. WCF服务端运行时架构体系详解[下篇]
  5. 自助用户选择VM Network
  6. 《移动优先与响应式Web设计》一1.2 设备不同,功能不同
  7. linux 日志服务器简单用
  8. 内容拾遗之字符串与数据结构
  9. 学习笔记(11月08日)--异常
  10. 1295. 统计位数为偶数的数字
  11. Hive UDF开发
  12. Mysql——应用学习之旅
  13. 动手写简单的音乐推荐系统
  14. 好用的截图、贴图、长截图(滚动截图)工具(MacOS、Windows)
  15. mysql查询以 开头的记录_sql 查询以指定字符开头sql查询语句
  16. ios app上架审核被拒及解决总结
  17. Ubuntu动态壁纸
  18. swift 获取导航栏底部线
  19. 我国自主研制成功铯原子喷泉钟 时间“精度”提高到600万年不差1秒
  20. 光敏电阻与光电二极管的区别

热门文章

  1. 系列学习 Gateway 之第 3 篇 —— 过滤器 Filter,自定义全局过滤器
  2. Spring Cloud Gateway源码解析
  3. 秒杀系统设计要点总结
  4. CAD图纸打印出来后很多CAD文字消失了怎么办?
  5. IDEA 安装插件后,重启插件消失问题
  6. TV版应用包名 TV常用apk包名 (当贝市场下载)
  7. 期刊论文公式编号、居中技巧
  8. 安装Petalinux
  9. html中pt与px的转换,ptpx换算(pt和像素换算)
  10. IO流和NIO流的区别