Stay Hungry, Stay Foolish

生成字典/字符串全排列

class QuanPaiLie:
   string=[]
   stlen=0
   def start(self,string):
      self.string=list(sorted(string))
      print(''.join(self.string))
      self.stlen=len(self.string)
      
      idx = self.get_idx()
      midx = self.get_min(idx)
      while midx >= 0:
         self.swap(idx, midx)
         self.reverse(idx + 1, len(self.string) - 1)
         idx = self.get_idx()
         midx = self.get_min(idx)
         print(''.join(self.string))

   def get_idx(self):
      idx = self.stlen - 2
      while idx > 0 and self.string[idx] >= self.string[idx + 1]:
         idx -= 1

      if idx>=0:
         return idx
      else:
         return -1

   def get_min(self,idx):
      tmpmin = self.string[idx + 1]
      if self.string[idx+1]>self.string[idx]:
         midx = idx + 1
      else:
         midx=-1

      for i in range(idx+1,len(self.string)):
         if self.string[i]>self.string[idx] and self.string[i]<tmpmin:
            tmpmin = self.string[i]
            midx=i
      return midx

   def swap(self,i,j):
      tmp=self.string[i]
      self.string[i]=self.string[j]
      self.string[j]=tmp

   def reverse(self,startidx=0,endidx=None):
      if endidx is None:
         endidx=len(self.string)-1
      if startidx>=endidx:
         return
      strlen=endidx-startidx+1
      center=strlen//2
      for i in range(center):
         tmp=self.string[endidx-i]
         self.string[endidx - i]=self.string[startidx+i]
         self.string[startidx+i]=tmp

测试:

print('汉字:')
qpl.start('你好么')
print('\n数字:')
qpl.start('123')
print('\n字母:')
qpl.start('abc')

结果输出:

汉字:
么你好
么好你
你么好
你好么
好么你
好你么

数字:
123
132
213
231
312
321

字母:
abc
acb
bac
bca
cab
cba
喜欢 (1)
取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦


Warning: Use of undefined constant PRC - assumed 'PRC' (this will throw an Error in a future version of PHP) in C:\inetpub\wordpress\wp-content\themes\XHBlog\comments.php on line 17
发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址