精华内容
下载资源
问答
  • 举个例子,比如你要对a,b,c三个字符进行全排列,那么它的全排列abc,acb,bac,bca,cba,cab这六种可能就是当指针指向第一个元素a时,它可以是其本身a(即和自己进行交换),还可以和b,c进行交换,故有3种可能,当第一...
  • 从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列。... 举个例子,比如你要对a,b,c三个字符进行全排列,那么它的全排列abc,acb,bac,bca,cba,c...

            从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列。当m=n时所有的排列情况叫全排列。

            公式:全排列数f(n)=n!(定义0!=1)

    1 递归实现全排列(回溯思想)

    1.1 思想

            举个例子,比如你要对a,b,c三个字符进行全排列,那么它的全排列有abc,acb,bac,bca,cba,cab这六种可能就是当指针指向第一个元素a时,它可以是其本身a(即和自己进行交换),还可以和bc进行交换,故有3种可能,当第一个元素a确定以后,指针移向第二位置,第二个位置可以和其本身b及其后的元素c进行交换,又可以形成两种排列,当指针指向第三个元素c的时候,这个时候其后没有元素了,此时,则确定了一组排列,输出。但是每次输出后要把数组恢复为原来的样子。

    1.2 python实现

    def permutations(arr, position, end):
        if position == end:
            print(arr)
        else:
            for index in range(position, end):
                arr[index], arr[position] = arr[position], arr[index]
                permutations(arr, position + 1, end)
                arr[index], arr[position] = arr[position], arr[index]  # 还原到交换前的状态,为了进行下一次交换
    
    
    arr = [1, 2, 3, 4]
    permutations(arr, 0, len(arr))

    2 深度优先搜索(DFS)实现全排列

    2.1 思想

            定义全排列问题:输入一个长度为n的列表arr,输出arr的全排列

    (1)首先可以确定的是,每一种全排列的结果中包含的列表长度均是n。想象面前有n个空盒子,现在要把这n个数放到这些空盒子里去,每个盒子只能放一个数。那么第一个盒子中可以放的选择是n种,可以使用一个循环来逐个尝试。

    for index in range(0, len(arr)):
        temp[position] = arr[index]

    (2)第一个盒子放完后,就该往第二个盒子里放了。假设第一个盒子里放的是arr的第一个数,那么第二个盒子就只能放第2~n个数了(不能重复)。为此引入visit列表用来标记arr中哪些数字被使用过了。初始化:

    visit = [True, True, True, True]

             这样,当第一个位置已经使用过时,就在visit里做标记:visit = [False, True, True, True]

              因此放第一个盒子的代码可以改写如下:

        for index in range(0, len(arr)):
            if visit[index] == True:
                temp[position] = arr[index]
                visit[index] = False

    (3)当第k个盒子处理完毕后,处理下一个盒子直接调用dfs(k+1)即可,也就是递归调用。解决了当下该如何做,下一步也就知道怎么做了。

    (4)递归调用的一定要注意的问题是递归调用的出口,否则循环调用下去程序会崩溃无法运行。在这个问题中什么时候结束递归调用呢?答案是当这n个盒子都放满了,即处理到第n+1个盒子时结束调用,同时输出此时的排列结果。

    2.2 python实现

    visit = [True, True, True, True]
    temp = ["" for x in range(0, 4)]
    
    
    def dfs(position):
        # 递归出口
        if position == len(arr):
            print(temp)
            return
        # 递归主体
        for index in range(0, len(arr)):
            if visit[index] == True:
                temp[position] = arr[index]
                visit[index] = False  # 试探 
                dfs(position + 1)
                visit[index] = True  # 回溯。非常重要
    
    
    arr = [1, 2, 3, 4]
    dfs(0)

    注释了“非常重要”的语句是不能省略的,省略后仅出现[1, 2, 3, 4]一条结果。dfs(k+1)前后的两条语句分别称之为试探和回溯

    3 combination和permutations函数的区别

    permutations方法重在排列:

    import itertools
    n=3
    a=[str(i) for i in range(n)]
    s=""
    s=s.join(a)
    for i in itertools.permutations(s,n):
        print (''.join(i))
    
    # 结果    
    012
    021
    102
    120
    201
    210
    

    combinations方法重在组合:

    import itertools
    n=3
    a=[str(i) for i in range(n)]
    s=""
    s=s.join(a)
    for i in itertools.combinations(s,n):
        print (''.join(i))
    
    # 结果   
    012
    

     

     

     

     

    展开全文
  • 求字符串全排列 python实现

    万次阅读 2018-04-07 10:53:04
    输入一个字符串,打印这个字符串中字符的全排列。 eg: 输入:abc 输出:abc acb bac bca cab cba 思路:将求字符串的全排列分解为两步: 第一步是确定第一个位置的字符,就是第一个位置与后边的所有字符...

    算法思想

    输入一个字符串,打印这个字符串中字符的全排列。
    eg:
    输入:abc
    输出:abc acb bac bca cab cba
    思路:将求字符串的全排列分解为两步:
    第一步是确定第一个位置的字符,就是第一个位置与后边的所有字符进行交换。
    第二步,就是对除了第一个位置的后边所有位置的字符进行相同处理;直至剩下一个字符,打印;
    具体的算法流程如下

    算法描述

    递归的出口,就是只剩一个字符的时候,递归的循环过程,就是从每个子串的第二个字符开始依次与第一个字符交换,然后继续处理子串,如果有重复的,然后对结果使用set去重就可以了

    #具体代码

    def perm(s=''):
        if len(s) <= 1:
            return [s]
        sl = []
        for i in range(len(s)):
            for j in perm(s[0:i] + s[i + 1:]):
                sl.append(s[i] + j)
        return sl
    
    
    def main():
        # 可能包含重复的串
        perm_nums = perm('abb')
        # 对结果去重
        no_repeat_nums = list(set(perm_nums))
        print('perm_nums', len(perm_nums), perm_nums)
        print('no_repeat_nums', len(no_repeat_nums), no_repeat_nums)
        pass
    
    
    if __name__ == '__main__':
        main()
    

    附上c语言实现

    c语言实现

    参考

    http://www.cnblogs.com/liang1101/p/6376210.html
    https://blog.csdn.net/xkx_1223_xkx/article/details/78002186

    转载请注明出处:
    CSDN:楼上小宇__home:http://blog.csdn.net/sty945

    展开全文
  • abc全排列

    2020-06-24 13:49:32
    对a,b,c进行全排列输出如 ['a', 'b', 'c'] ['a', 'c', 'b'] ['b', 'a', 'c'] ['b', 'c', 'a'] ['c', 'b', 'a'] ...接下来对第二个元素到队位进行全排列python中传递ls和俩坐标, 切勿传递切片),直到传入的坐标

    对a,b,c进行全排列输出如

    ['a', 'b', 'c']
    ['a', 'c', 'b']
    ['b', 'a', 'c']
    ['b', 'c', 'a']
    ['c', 'b', 'a']
    ['c', 'a', 'b']
    

    用递归思想来实现,大体思路:每个元素都会可能会充当新排列的队头,所以产生了一个for循环,复杂度是n用于交换头部元素和第i个元素,交换完毕产生新的队列,如
    [‘b’, ‘a’, ‘c’]
    接下来对第二个元素到队位进行全排列(python中传递ls和俩坐标, 切勿传递切片),直到传入的坐标重叠便是递归的出口,也可以在这里先打印。因为我们一直对ls进行排序,所以这里我们对元素位置还原初始状态是为了进行下一次的排序。
    整体思路很简单,就是递归有序的交换元素。至于为什么会产生原顺序的[‘a’, ‘b’, ‘c’],因为我们每次都对第一个元素和第一个元素进行了交换。

    def swap(ls, i, j):
        ls[i], ls[j] = ls[j], ls[i]
    
    def perm(ls, p, q):
        if p == q:
            print(ls)
            return
        for i in range(p, q+1, 1):
            swap(ls, p, i)
            perm(ls, p+1, q)
            swap(ls, i, p)  # 还原
    
    if __name__ == "__main__":
        # ls = ["a", "b", "c", "d"]
        ls = ["a", "b", "c"]
        num = len(ls)
        for i in range(num):
            swap(ls, 0, i)
            perm(ls, 1, num-1)  # 还原
            swap(ls, i, 0)
    

    一定要记得还原原来的数组。视频讲解链接

    展开全文
  • python实现全组合与全排列

    千次阅读 2020-07-07 16:00:48
    python全组合与全排列 一、全排列 1.题目描述 输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。 2.做题思路 ...

    python全组合与全排列

    一、全排列

    1.题目描述

    输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。

    2.做题思路

    递归+回溯

    第一步

    确定第一个位置的字符,第一个位置与后边的所有字符进行交换(包括该字符本身)。
    如下图:A与A,B,C进行交换

    第二步

    对除了第一个位置的后边所有位置的字符进行相同处理;

    结束条件:a)剩下一个字符;b)没有剩余字符。两种选择都可以获得正确答案。

    简单来说,它的思想即为,确定第1位,对n-1位进行全排列,确定第二位,对n-2位进行全排列。

    思维导图

    在这里插入图片描述

    3.代码

    from copy import deepcopy
    def permutations(arr, position, end):
        if position == end:
    #    if position == end-1:
            h.append(deepcopy(arr))
     
        else:
            for index in range(position, end):
                arr[index], arr[position] = arr[position], arr[index]
    
                permutations(arr, position+1, end)
                arr[index], arr[position] = arr[position], arr[index]
    global h
    h  = []
    arr = ["a","b","c"]
    permutations(arr, 0, len(arr))
    print(h)
    
    

    4.结果

    在这里插入图片描述

    5.字符串有重复字符

    上述代码是针对字符串无重复字符的情况,若有重复字符则在交换数据时,先查询区间内(两个交换字符的区间)是否有重复字符,如果有则跳过。

    二、全组合

    1.题目描述

    字符串“abc”的字符组合

    产生的顺序为: a、b、c、ab、ac、bc、abc

    2.做题思路

    利用递归的特性确定字符生成的顺序组合的问题,跟求排列的问题类似,很容易的想到递归的实现方式。比如在一个长度为n的字符串中选择m个字符,对于第一个字符有两种选择,选或者不选。

    a)选择长度为n的字符串中的第一个字符,那么要在其余的长度n-1的字符串中选择m-1个字符

    b)第二是不选择长度为n的字符串中的第一个字符,那么要在其余的长度n-1的字符串中选择m个字符

    结束条件

    a)已经找到了m个字符,即当m==0时结束;b)当剩余字符串的长度小于m时,结束递归。

    3.代码

    # 全组合
    from copy import deepcopy
    def per(arr, start, num,res):
        if num == 0:
            h.append(deepcopy(res))
            return 
        if len(arr)-start<num:
            return 
        else:
            res.append(arr[start])
            per(arr, start+1, num-1,res)
            temp=res.pop()
            per(arr, start+1, num,res)
    global h
    h  = []
    arr = ["a","b","c"]
    start = 0
    resul= []
    for i in range(1,len(arr)+1):
        per(arr,0, i,resul)
    print(h)
    

    4.结果

    在这里插入图片描述

    展开全文
  • python——递归方法解决全排列问题

    千次阅读 2019-05-11 11:21:10
    ▪输⼊的字符s=“ABC”,由字符A,B 和C 组成的全排列为 –[“ABC”, “ACB”, “BAC”, “BCA”, “CAB”, “CBA”] 解题思路: ▪不妨设求解原问题的函数为permutation(s) ▪如何将问题进行分解形成子问题,...
  • 几种实现全排列的算法及Python实现

    万次阅读 多人点赞 2018-08-25 19:39:59
    实现对数组的全排列有多种方法,本文主要叙述利用普通递归和深度优先算法两种方法对数组进行全排列的主要思想,另外给出基于Python语言的实现。 1.普通递归实现全排列 思想: 举个例子,比如你要对a,b,c三个...
  • 前言 这是一个的经典的问题 设计一个算法,输出一个字符串字符的全排列。 比如,String = “abc” ...比如:首先我要打印abc全排列,就是第一步把a 和bc交换(得到bac,cab),这需要一个for循...
  • 字符串全排列(无重复) 问题描述 输入一个无重复字符的字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。 解题思路 对于字符...
  • 比如 s = ‘abc’,那字符串 s 的全排列结果为“abc”,“abc”,“bac”,“bca”,“cba”,“cab”。 (1)代码 def string_permutation(s): # 迭代终止条件 if len(s) <= 1: return [s] else: temp_list =...
  • 生成全排列 【问题】给定一个包含不同字母的串,求它的所有可能的排列。 比如,给定"ABC",应该输出: ABC ACB BAC BCA CAB CBA 分析: 思路1— 将所有这些全排列分类,开始的字母是什么?只可能是串中的某一个字母...
  • 例如输入字符串abc,则按字典序打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。 思路:字典序即该字符串的下个字符串保持尽可能长的前缀,并且下个字符串是拥有共同前缀的所有字符串中最小的;...
  • 前言 这是一个经典的问题 设计一个算法,输出一个字符串字符的全排列问题。 ...比如:首先我要打印abc全排列,就是第一步把a和b和c进行交换,得到bac,cba,这就需要一个for循环,循环里面有...
  • python实现全排列 给定alist,实现全排列: 首先比如【a,b,c】,先确定index=a,abc,然后对bc进行全排列。得到acb; 然后将a和b交换位置,得到bac,然后对ac进行全排列 bca 将a和B的位置再交换回来,变成最初的样子 ...
  • # 输入一个字符串,打印出该字符串中字符的所有排列。...# 输出:["abc","acb","bac","bca","cab","cba"] # class Solution: # def permutation(self, s): # if not s: return # s=list(sorted(s)) # res=[] #
  • 例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。 首先,这里以数组为例。数组arr [1,2,3,4] 1 2 3 4 为第一个 然后保持1不变,对【2 3 4】 进行排列 然后保持2 不变对...
  • 字符串的全排列 题目描述: 输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。 输入描述:输入一个字符串,长度...
  • 例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。 输入描述: 输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。 # -*- coding:utf-8 -*- import ...
  • 字符串的全排列

    2017-02-12 22:05:00
    例如: 对于字符串"abc", 全排列为cba bca bac cab acb abc 本文采用非递归方法给出Python代码实现。 实现的思路采用从特殊到一般的方法(PS: 我的高中数学老师Mr Xie最为推崇的数学方法就是"从特殊到一般,再从...
  • 本文算法使用python3实现 1.问题一 1.1 题目描述:   输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。(输入...
  • 本文算法使用python3实现 1.问题一 1.1 题目描述:   输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。(输入...
  • python 多层表达式

    2018-06-25 19:26:01
    对于字符串 ‘ABC’ 和 ‘123’,可以使用两层循环,生成全排列: [m + n for m in 'ABC' for n in '123'] #['A1', 'A2', 'A3', 'B1', 'B2', 'B3', 'C1', 'C2', 'C3'] 翻译成循环代码就像下面这样: ...
  • 剑指offer刷题笔记27(python) ...这个题可以看出成字符串的全排列全排列,我在另一篇博客里做了说明Python 递归和非递归实现全排列 (去重和不去重) 代码1 第一种方法是递归。递归有两种写法,...
  • Python基础编程题目29

    2018-12-21 10:44:32
    递归写出“abc全排列 def bitStr(n,s): ''' 递归计算abc的所有排列可能。 :param n: :param s: :return: ''' if n==1: return s return [digit + bits for digit in bitStr(1,s) for bits in...
  • 下面以字符串 abc 为 例介绍对字符串进行全排列的方法 。 具体步骤如下 : (1)首先固定第一个字符 a,然后对后面的两个字符 b与 c进行全排列: (2)交换第一个字符与其后面的字符,即交换 a与 b,然后固定第一个字符 b...
  • python——多重表达式

    千次阅读 2017-04-07 20:18:49
    对于字符串 'ABC' 和 '123',可以使用两层循环,生成全排列: >>> [m + n for m in 'ABC' for n in '123'] ['A1', 'A2', 'A3', 'B1', 'B2', 'B3', 'C1', 'C2', 'C3'] 翻译成循环代码就像下面这样:
  • python列表推导式

    2019-07-14 14:19:19
    1、列表生成式则可以用一行语句生成list >>> [x * x for x in range(1, 11)...2、还可以使用两层循环,可以生成全排列: >>> [m + n for m in 'ABC' for n in 'XYZ'] ['AX', 'AY', 'AZ', 'BX', 'B...
  • 以字符串 abc 为例介绍对字符串进行全排列的方法。 (1) 首先固定第一个字符 a,然后对后面的两个字符 b、c 进行全排列; (2) 交换第一个字符与其后面的字符,即交换 a 与 b,然后对后面的两个字符 a与c 进行全排列;...
  • 本文实例讲述了Python列表生成式与生成器操作。分享给大家供大家参考,具体如下: 列表生成式:能够用来创建list的生成式 比如想要生成类似[1*1,2*2,3*3,…..100*100]的这种list时 可以用 [x * x for x in range(1,...
  • python中的高级特性

    2017-12-26 21:51:48
    一. 迭代 1. 枚举:enumerate #把一个 list 变成索引­元素对 2. 迭代 #通过collections模块的Iterable类型判断 二. 列表生成式 ...- 生成‘ABC’与‘123’的全排列; - 列出当前目录下的所有文

空空如也

空空如也

1 2 3
收藏数 52
精华内容 20
关键字:

python全排列abc

python 订阅