LeetCode Problems 903
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'
, 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:
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相关推荐
- LeetCode Problems #935
2018/11/11 935. Knight Dialer 问题描述: A chess knight can move as indicated in the chess diagram below: ...
- leetcode dfs_深度优先搜索:具有6个Leetcode示例的DFS图遍历指南
leetcode dfs Have you ever solved a real-life maze? The approach that most of us take while solving ...
- LeetCode 1166. 设计文件系统(哈希map)
文章目录 1. 题目 2. 解题 1. 题目 你需要设计一个能提供下面两个函数的文件系统: create(path, value): 创建一个新的路径,并尽可能将值 value 与路径 path 关联 ...
- LeetCode 1233. 删除子文件夹
1. 题目 你是一位系统管理员,手里有一份文件夹列表 folder,你的任务是要删除该列表中的所有 子文件夹,并以 任意顺序 返回剩下的文件夹. 我们这样定义「子文件夹」: 如果文件夹 folder[ ...
- [LeetCode]小工具,统计数量,隐藏上锁的题目
LeetCode Problems List没有统计数量的功能,顺手写了一个. 下面两段只是用jquery调整网页上显示的内容,刷新网页就没用了. 比如想看题目里一共有多少Easy, Medium和H ...
- 【Leetcode】精选算法top200道(二)
二.中等 339.嵌套列表权重和 给定一个嵌套的整数列表 nestedList ,每个元素要么是整数,要么是列表.同时,列表中元素同样也可以是整数或者是另一个列表. 整数的 深度 是其在列表内部的嵌套 ...
- 好教程推荐系列:力扣LeetCode官网/labuladong的算法小抄/漫画算法小灰/刷题模板
LeetCode官网 https://leetcode.com/ https://leetcode-cn.com/ labuladong的算法小抄 刷算法全靠套路,认准 labuladong 就够了! ...
- Leetcode 1233 删除子文件夹 (C++题解)
你是一位系统管理员,手里有一份文件夹列表 folder,你的任务是要删除该列表中的所有 子文件夹,并以 任意顺序 返回剩下的文件夹. 我们这样定义「子文件夹」: 如果文件夹 folder[i] 位于另 ...
- Leetcode-How-What 力扣Leetcode刷题指南
Leetcode-How-What 力扣Leetcode刷题指南 About the way how to use Leetcode wisely for preparing the intervie ...
- 力扣刷题心得(设计类题目)
设计类题目基本考察的是你对现实事物的抽象能力,一般会遇到一些类的设计.字符串切分.集合的使用(list.map.set.stack.deque)等,结束后我会更新一些关于这些集合的常见使用方法和场景. ...
最新文章
- PHP中foreach详细解读
- 计算机应用基础win7作业3答案,电大: 国开计算机应用基础(WIN7)形成性考核册3答案.docx...
- 人,是否应该不要去好高骛远
- WCF服务端运行时架构体系详解[下篇]
- 自助用户选择VM Network
- 《移动优先与响应式Web设计》一1.2 设备不同,功能不同
- linux 日志服务器简单用
- 内容拾遗之字符串与数据结构
- 学习笔记(11月08日)--异常
- 1295. 统计位数为偶数的数字
- Hive UDF开发
- Mysql——应用学习之旅
- 动手写简单的音乐推荐系统
- 好用的截图、贴图、长截图(滚动截图)工具(MacOS、Windows)
- mysql查询以 开头的记录_sql 查询以指定字符开头sql查询语句
- ios app上架审核被拒及解决总结
- Ubuntu动态壁纸
- swift 获取导航栏底部线
- 我国自主研制成功铯原子喷泉钟 时间“精度”提高到600万年不差1秒
- 光敏电阻与光电二极管的区别