【发布时间】:2020-02-16 18:54:02
【问题描述】:
我有一个字符串显示 m x n 网格中的步骤,如下所示: https://leetcode.com/problems/unique-paths/
step = 'DDRR'
D 表示向下,R 表示向右 我想显示没有替换的排列,我发现了 Python 内置的 itertools。但是它说:
元素根据它们的位置而不是它们的值被视为唯一的。所以如果输入元素是唯一的,就不会有重复值。
所以当我使用 itertools.permutation(step,4) 时,它包含许多复制。
>>> itertools.permutations(step,4)
('D', 'D', 'R', 'R')
('D', 'R', 'D', 'R')
('D', 'R', 'R', 'D')
('D', 'R', 'D', 'R')
('D', 'R', 'R', 'D')
('D', 'D', 'R', 'R')
('D', 'D', 'R', 'R')
('D', 'R', 'D', 'R')
('D', 'R', 'R', 'D')
('D', 'R', 'D', 'R')
('D', 'R', 'R', 'D')
('R', 'D', 'D', 'R')
('R', 'D', 'R', 'D')
('R', 'D', 'D', 'R')
('R', 'D', 'R', 'D')
('R', 'R', 'D', 'D')
('R', 'R', 'D', 'D')
('R', 'D', 'D', 'R')
('R', 'D', 'R', 'D')
('R', 'D', 'D', 'R')
('R', 'D', 'R', 'D')
('R', 'R', 'D', 'D')
('R', 'R', 'D', 'D')
我想要类似的东西:
('R', 'D', 'R', 'D')
('R', 'D', 'D', 'R')
('D', 'R', 'R', 'D')
('D', 'D', 'R', 'R')
('D', 'R', 'D', 'R')
('R', 'R', 'D', 'D')
我使用 set(itertools.permutations(step,4)) 找到了一些答案,但由于应用 set() 方法,itertools.permutation() 方法仍然计算所有可能性。有没有办法避免它,或者是否有任何内置函数可以在 Python 中进行不重复的排列?
【问题讨论】:
-
我使用
itertools.permutations(step,4)得到空列表,也许你的意思是step = list('DDRR') -
我的怀疑是,任何计算没有重复的排列的算法都不会比你在问题中提到的 itertools 和 set 方法更有效(可能效率更低),所以可能不值得担心,除非你将使用更长的字符串。
-
@SimonN “多长时间”?对于
DDDDDRRRRR,已经有 360 万个排列,但只有 252 个不同的排列,因此仅产生后者的合理方法应该不会有更快的问题。 -
所以你想计算精确排列 (m-1)
D符号和 (n-1)R的不同组合的数量,或者等效地 nR符号和 (m -1)它们之间的酒吧|。 (您不需要计算实际的组合,并且对于 m,n 最多 100 这将是令人望而却步的)。方式数由众所周知的Stars-and-Bars formula给出 -
@SimonN:这完全不正确,请记住 C(n,k) 的数量级为 O(2^n),因此对于非玩具值,您将很快耗尽内存和 CPU n. [记住[sum(C(n,k)) over k] = 2^n]的恒等式
标签: python permutation itertools combinatorics