zoukankan      html  css  js  c++  java
  • python3:实现字符串的全排列(有重复字符)

    抛出问题

      求任意一个字符串的全排列组合,例如a='123',输出 123,132,213,231,312,321。

    解决方案

      

    #字符串任意两个位置字符交换
    def str_replace(str, x, y):
        if x == y:
            return str
        x_val = str[x:x+1]
        y_val = str[y:y+1]
        if x < y:
            str = str[0:x] + y_val + str[x+1:y] + x_val + str[y+1:len(str)]
        else:
            str = str[0:y] + x_val + str[y+1:x] + y_val + str[x+1:len(str)]
        return str
    #递归求结果
    def str_sort(str,x):
    
        if x == len(str):               #当x为字符串的最大长度时返回当前字符交换的结果
            global str_list
            str_list.append(str)
            return
        for i in range(x,len(str)):
            if str[i] not in str[x:i]:
                str = str_replace(str,i,x)  #递归遍历第i个字符,
                str_sort(str,x+1)
                str = str_replace(str,x,i)  #恢复字符串原来的顺序,便于下次遍历
            else:
                return
    s = 'abcc'
    global str_list
    str_list = []
    str_sort(s,0)
    
    print(len(str_list), str_list)

      相较于有重复的方法,只是多了一步,也就是在遍历第i个元素前,做个判断,就是当前需要交换的字符是否是已经‘打头’,如果有了就忽略,继续执行

      可能我解释的理解的也不是很到位,欢迎加Q交流 1156553820

  • 相关阅读:
    给域名添加解析
    MATLAB c/c++调用matlab<dll>
    MATLAB 矩阵生成有向网络图
    MATLAB 矩阵生成无向网络图
    MATLAB RGB2YCbCr、YCbCr2RGB
    MATLAB RGB2YUV、YUV2RGB
    MATLAB 直方图匹配
    MATLAB 双边滤波
    MATLAB 区域填充算法,队列版
    MATLAB 二值图像连通区域标记法,两步法
  • 原文地址:https://www.cnblogs.com/7749ha/p/9012223.html
Copyright © 2011-2022 走看看