亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

python求一個(gè)字符串的所有排列的實(shí)現(xiàn)方法

 更新時(shí)間:2020年02月04日 14:29:18   作者:布?xì)W不歐  
這篇文章主要介紹了python求一個(gè)字符串的所有排列的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

題目描述:

設(shè)計(jì)一個(gè)程序,當(dāng)輸入一個(gè)字符串時(shí),要求輸出這個(gè)字符串的所有排列。
例如輸入字符串 abc,要求輸出由字母 a、b、c 所能排列出來(lái)的所有字符串 abc,acb,bac,bca,cab,cba。

方法:遞歸法

以字符串 abc 為例介紹對(duì)字符串進(jìn)行全排列的方法。
(1) 首先固定第一個(gè)字符 a,然后對(duì)后面的兩個(gè)字符 b、c 進(jìn)行全排列;
(2) 交換第一個(gè)字符與其后面的字符,即交換 a 與 b,然后對(duì)后面的兩個(gè)字符 a與c 進(jìn)行全排列;
(3) 由于第二步交換了 a與b 破壞了字符串原來(lái)的順序,所以需要再次交換 a與b 使其恢復(fù)到原來(lái)的順序,然后交換第一個(gè)字符與第三個(gè)字符(交換a和c),接著固定第一個(gè)字符c,對(duì)后面的兩個(gè)字符 a與b 求全排列。
在對(duì)字符串求全排列的時(shí)候就可以采用遞歸的方式求解。


在使用遞歸求解的時(shí)候,要注意:
(1) 逐漸縮小問(wèn)題的規(guī)模,并且可以用同樣的方法來(lái)求解子問(wèn)題;
(2) 遞歸一定要有結(jié)束條件,否則會(huì)導(dǎo)致程序陷入死循環(huán);

代碼實(shí)現(xiàn):

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# @Time  : 2020/2/3 9:49
# @Author : buu
# @Software: PyCharm
# @Blog  :https://blog.csdn.net/weixin_44321080
def swap(str, i, j):
  # 交換字符數(shù)組下標(biāo)為i和j對(duì)應(yīng)的字符
  tmp = str[i]
  str[i] = str[j]
  str[j] = tmp


def permutation(str, start):
  """
  對(duì)字符串中的字符進(jìn)行全排列
  :param str: 待排序的字符串,list
  :param start: 待排序的子字符串的首字符下標(biāo)
  :return:
  """
  if str == None or start < 0:
    return
  if start == len(str) - 1:
    # 完成全排列后輸出當(dāng)前排列的字符串
    print(''.join(str),end=' ')
  else:
    i = start
    while i < len(str):
      # 交換start與i所在位置的字符
      swap(str, start, i)
      # 固定第一個(gè)字符,對(duì)剩余的字符進(jìn)行全排列
      permutation(str, start + 1)
      # 還原start與i所在位置的字符
      swap(str, start, i)
      i += 1


def permutation_transe(s):
  str = list(s)
  permutation(str, 0)


if __name__ == '__main__':
  s = 'abc'
  permutation_transe(s)

結(jié)果:


算法性能分析:
假設(shè)這種方法所需的基本操作數(shù)為 f(n),f(n) = n×f(n-1) = …= n!
所以時(shí)間復(fù)雜度為O(n!);
空間復(fù)雜度為O(1);

引申:

如何去掉重復(fù)的排列?
當(dāng)字符串中沒(méi)有重復(fù)的字符的時(shí)候,它的所有組合對(duì)應(yīng)的字符串就沒(méi)有重復(fù)的情況;當(dāng)時(shí)當(dāng)字符串中有重復(fù)的字符的時(shí)候,例如 ‘baa',此時(shí)如果按照上面介紹的算法求全排列會(huì)有重復(fù)的字符串。

思路:
全排列的主要思路為:從第一個(gè)字符起每個(gè)字符分別與它們后面的字符進(jìn)行交換:例如對(duì)于“baa”,交換 baa 第一個(gè)與第二個(gè)字符后得到“aba”,再考慮交換 baa 第一個(gè)與第三個(gè)字符后得到“aab”,由于 baa 的第二個(gè)字符與第三個(gè)字符相等,所以會(huì)導(dǎo)致兩種交換方式得到的 aba 與 aab 對(duì)應(yīng)的全排列是重復(fù)的(在固定aba與aab的第一個(gè)字符的情況下,它們對(duì)應(yīng)的全排列都為 aba,aab)。
所以可以知道,去掉重復(fù)排列的主要思路為:
從第一個(gè)字符起,每個(gè)字符分別與它后面的非重復(fù)出現(xiàn)的字符進(jìn)行交換。在遞歸的基礎(chǔ)上只需要增加一個(gè)判斷字符是否重復(fù)出現(xiàn)的函數(shù)即可。

代碼實(shí)現(xiàn):

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# @Time  : 2020/2/3 10:37
# @Author : buu
# @Software: PyCharm
# @Blog  :https://blog.csdn.net/weixin_44321080
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# @Time  : 2020/2/3 9:49
# @Author : buu
# @Software: PyCharm
# @Blog  :https://blog.csdn.net/weixin_44321080
def swap(str, i, j):
  # 交換字符數(shù)組下標(biāo)為i和j對(duì)應(yīng)的字符
  tmp = str[i]
  str[i] = str[j]
  str[j] = tmp

def isDuplicate(str,begin,end):
  """
  判斷 [begin,end)區(qū)間中是否有字符與 *end相等
  :param begin: 指向字符的指針
  :param end: 指向字符的指針
  :return: 如果有相等的字符True,else False
  """
  i=begin
  while i<end:
    if str[i]==str[end]:
      return True
    else:
      i+=1
  return False


def permutation(str, start):
  """
  對(duì)字符串中的字符進(jìn)行全排列
  :param str: 待排序的字符串,list
  :param start: 待排序的子字符串的首字符下標(biāo)
  :return:
  """
  if str == None or start < 0:
    return
  if start == len(str) - 1:
    # 完成全排列后輸出當(dāng)前排列的字符串
    print(''.join(str),end=' ')
  else:
    i = start
    while i < len(str):
      # 若有重復(fù)字符,則終止當(dāng)前循環(huán),開(kāi)始下一次循環(huán)
      if isDuplicate(str,start,i):
        i+=1
        continue
      # 交換start與i所在位置的字符
      swap(str, start, i)
      # 固定第一個(gè)字符,對(duì)剩余的字符進(jìn)行全排列
      permutation(str, start + 1)
      # 還原start與i所在位置的字符
      swap(str, start, i)
      i += 1


def permutation_transe(s):
  str = list(s)
  permutation(str, 0)


if __name__ == '__main__':
  s = 'baa'
  permutation_transe(s)

結(jié)果:

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python Http發(fā)送請(qǐng)求淺析

    Python Http發(fā)送請(qǐng)求淺析

    這篇文章主要介紹了Python Http發(fā)送請(qǐng)求淺析,文章主要通過(guò)從requests、aiohttp、httpx三個(gè)接口請(qǐng)求展開(kāi)詳情,需要的朋友可以參考一下文章具體詳細(xì)內(nèi)容
    2022-06-06
  • python+rsync精確同步指定格式文件

    python+rsync精確同步指定格式文件

    這篇文章主要為大家詳細(xì)介紹了python+rsync精確同步指定格式文件,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • python讀取npy文件數(shù)據(jù)實(shí)例

    python讀取npy文件數(shù)據(jù)實(shí)例

    npy文件用于存儲(chǔ)重建ndarray所需的數(shù)據(jù)、圖形、dtype?和其他信息,下面這篇文章主要給大家介紹了關(guān)于python讀取npy文件數(shù)據(jù)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-04-04
  • 基于Python和Scikit-Learn的機(jī)器學(xué)習(xí)探索

    基于Python和Scikit-Learn的機(jī)器學(xué)習(xí)探索

    這篇文章主要介紹了基于Python和Scikit-Learn的機(jī)器學(xué)習(xí)探索的相關(guān)內(nèi)容,小編覺(jué)得還是挺不錯(cuò)的,這里分享給大家,供需要的朋友學(xué)習(xí)和參考。
    2017-10-10
  • Python OS模塊常用函數(shù)說(shuō)明

    Python OS模塊常用函數(shù)說(shuō)明

    這篇文章主要介紹了Python OS模塊常用函數(shù)說(shuō)明,本文列出了一些在os模塊中比較有用的部分函數(shù),它們中的大多數(shù)都簡(jiǎn)單明了,需要的朋友可以參考下
    2015-05-05
  • 詳解python的函數(shù)遞歸與調(diào)用

    詳解python的函數(shù)遞歸與調(diào)用

    Python中的函數(shù)遞歸是一種函數(shù)調(diào)用自身的編程技術(shù),遞歸可以用來(lái)解決問(wèn)題,特別是那些可以分解為更小、相似子問(wèn)題的問(wèn)題,本文將給大家詳細(xì)的講解一下python的函數(shù)遞歸與調(diào)用,需要的朋友可以參考下
    2023-10-10
  • Matplotlib繪圖基礎(chǔ)之坐標(biāo)軸詳解

    Matplotlib繪圖基礎(chǔ)之坐標(biāo)軸詳解

    Matplotlib的坐標(biāo)軸是用于在繪圖中表示數(shù)據(jù)的位置的工具,也是為了幫助觀察者了解圖像中數(shù)據(jù)的位置和大小,下面小編就來(lái)和大家詳細(xì)聊聊Matplotlib繪圖時(shí)坐標(biāo)軸的具體使用吧
    2023-07-07
  • wxPython色環(huán)電阻計(jì)算器

    wxPython色環(huán)電阻計(jì)算器

    這篇文章主要為大家詳細(xì)介紹了wxPython色環(huán)電阻計(jì)算器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-11-11
  • Python利用for循環(huán)打印星號(hào)三角形的案例

    Python利用for循環(huán)打印星號(hào)三角形的案例

    這篇文章主要介紹了Python利用for循環(huán)打印星號(hào)三角形的案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-04-04
  • 21行Python代碼實(shí)現(xiàn)拼寫檢查器

    21行Python代碼實(shí)現(xiàn)拼寫檢查器

    21行python代碼實(shí)現(xiàn)的一個(gè)簡(jiǎn)易但是具備完整功能的拼寫檢查器,感興趣的小伙伴們可以參考一下
    2016-01-01

最新評(píng)論