首先看一下什么是字典序

我们的目的是给定一个数字n,首先构造range(1,n+1),即1,2,3......n的排列,然后生成一个字典序,代码如下:

#!/usr/bin/python
# coding:utf-8def next_permutation(A):"""input:  array of a permutation of n numbersoutput: the next permutationAlgorithm: dicttionary order"""# print(A)n = len(A)last = n - 1i = last
# 判断在哪个位置改变iwhile i > 0 and A[i] < A[i - 1]:i -= 1if i == 0:return Falsej = last
# 找到交换的位置jwhile j >= i:j -= 1if A[i] > A[j+1] > A[i - 1]:breakA[j+1], A[i - 1] = A[i - 1], A[j+1]# 这种Python特有的变量交换方式是直接修改的内存地址,因此可以改变传入实参的值A[i:] = A[i:][::-1]
# 如果当前已经生成最后一个字典序,即递减序列,则下一次不需要再排列if A == sorted(A, reverse=True):return Falsereturn Truedef permutation(n):"""Input:  int num nOutput: permutation of the n number from small to big"""B = []A = list(range(1, n + 1))B.append(A[::])flag = next_permutation(A)B.append(A[::])while flag:flag = next_permutation(A)B.append(A[::])return BAA = permutation(4)
for i in AA:print(i)
output:
[1, 2, 3, 4]
[1, 2, 4, 3]
[1, 3, 2, 4]
[1, 3, 4, 2]
[1, 4, 2, 3]
[1, 4, 3, 2]
[2, 1, 3, 4]
[2, 1, 4, 3]
[2, 3, 1, 4]
[2, 3, 4, 1]
[2, 4, 1, 3]
[2, 4, 3, 1]
[3, 1, 2, 4]
[3, 1, 4, 2]
[3, 2, 1, 4]
[3, 2, 4, 1]
[3, 4, 1, 2]
[3, 4, 2, 1]
[4, 1, 2, 3]
[4, 1, 3, 2]
[4, 2, 1, 3]
[4, 2, 3, 1]
[4, 3, 1, 2]
[4, 3, 2, 1]

这里做下解释:

代码的思想就是通过当前的字典序生成下一个字典序,

当前的字典序一定是如下图这个样子的,就是从第i个到最后一个是递减的,第i-1个比第i个小,那么我们要想求到下一个字典序,首先要变的肯定是第i-1个,只需要将第i-1个和在[i, j]范围内介于[p,q]的那个值进行交换,也就是说我们需要从j到i进行遍历,找到第一个符合这种情况的那个值,也就是介于[p, q]之间的最小值与i-1的值进行交换即可,那么交换过后,[i,j]依然满足递减的关系,那么只需要将[i, j]的顺序反转一下就可以了,使[i, j]满足递增也就是最小字典序。

Python 生成字典序(生成下一个字典序)相关推荐

  1. 计算机算法设计与分析字典序问题,全排列下一个字典序上一个字典序问题(C++)...

    1.用递归(DFS)和非递归两种方式输出一个序列的全排列: 2.找到当前序列的下一个和上一个字典序. 全排列和字典序 一个序列的全排列是序列中元素所有可能的排列,排列方式共有n!个. 一个序列的字典序 ...

  2. 创意生成网络can_下一个网络创意时应该做的10件事

    创意生成网络can You're spending a lazy afternoon with your family, when a brilliant idea suddenly strikes ...

  3. 下一个排列Python解法

    整数数组的一个 排列 就是将其所有成员以序列或线性顺序排列. 例如,arr = [1,2,3] ,以下这些都可以视作 arr 的排列:[1,2,3].[1,3,2].[3,1,2].[2,3,1] . ...

  4. leetcode —— 31. 下一个排列

    实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列. 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列). 必须原地修改,只允许使用额外常数空间. ...

  5. 《LeetCode力扣练习》第31题 下一个排列 Java

    <LeetCode力扣练习>第31题 下一个排列 Java 一.资源 题目: 整数数组的一个 排列 就是将其所有成员以序列或线性顺序排列. 例如,arr = [1,2,3] ,以下这些都可 ...

  6. LeetCode 30串联所有单词的子串31下一个排列

    标题 串联所有单词得字串 下一个排列 维护真的不易,如有帮助还请点赞关注,关注公众号bigsai回复进群即可加入打卡. 串联所有单词得字串 题目描述: 给定一个字符串 s 和一些长度相同的单词 wor ...

  7. 72.编辑距离105.前序中序遍历序列构造二叉树151.翻转字符串里的单词104.二叉树的最大深度76.最小覆盖子串110.平衡二叉树31.下一个排列

    72.编辑距离 给你两个单词 word1 和 word2, 请返回将 word1 转换成 word2 所使用的最少操作数 .你可以对一个单词进行如下三种操作:插入一个字符,删除一个字符,替换一个字符. ...

  8. (LeetCode)下一个排列

    目录 题目要求 题目理解以及思路分析 代码分部讲解 第一部分 第二部分 第三部分 第四部分 题目要求 整数数组的一个 排列  就是将其所有成员以序列或线性顺序排列. 例如,arr = [1,2,3] ...

  9. 31. Next Permutation (java 字典序生成下一个排列)

    题目: Implement next permutation, which rearranges numbers into the lexicographically next greater per ...

最新文章

  1. fceux源码解析_fceux源码解析_从源代码制作deb包的两种方法以及修改已有deb包(转载)...
  2. 人为何会发烧,超过42°C会怎样?
  3. python基础-字典
  4. Algorithms_基础数据结构(01)_线性表之数组数组的应用案例分析
  5. 找不到_笔记本找不到无线网络怎么办
  6. 2、Keepalived提供日志与双主模型演示
  7. rm 给你一个反悔的机会
  8. 玩转linux文件描述符和重定向,玩转Linux文件描述符和重定向
  9. iOS实现字符串动画
  10. 【java】创建一个JFrame,可以使得一个字符串用按钮进行颜色的选择
  11. 关于group by 两个或以上条件的分析
  12. java流程图平行四边形_流程图图形标准含义
  13. 清华计算机专业培养,清华大学计算机本科生培养方案..pdf
  14. NSIS中文用户手册下载(免费下载)
  15. django csrf 防跨站攻击
  16. Android开发中导入字体库
  17. “跨次元”目标检测模型hold住各种画风,真人赛博恐龙梵高画作都能识别,复旦校友一作,在线Demo可玩...
  18. OKRA-ERP简单实用产能分析
  19. 基于java的高校实验室排课系统
  20. uva 10118 Free Candies

热门文章

  1. 2013.6.19雷阿伦总决赛关键一投
  2. 如何在python中输入复杂的数学公式_如何快速方便随意的在Word中输入复杂的数学公式...
  3. 纵横网络靶场 部分wp
  4. STM32寄存器点亮LED(什么是寄存器、GPIO工作方式、点亮原理)
  5. 浸没式冷却-散热技术新趋势,一起学Flotherm电子元器件散热仿真
  6. 计算机辅助设计和工程图学,如何学会AUTO-CAD计算机辅助设计.
  7. oracle数据库审计文件是哪个,oracle数据库审计
  8. BitDefender 2010
  9. Ubuntu 13.10 安装stardict词典(星际译王)
  10. 屹立在Gartner领导象限的国产存储