您的位置:首页 > 编程语言 > Python开发

字符串的排列(字典序)

2017-01-25 03:32 190 查看


题目描述

输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。 
输入描述:
输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。


方法一:使用python的内置函数

# -*- coding:utf-8 -*-

from itertools import *

class Solution:
def Permutation(self, ss):
# write code here
if ss == '':
return []
# python字典序函数
lst = list(permutations(list(ss),len(ss)))
# print lst
for i in range(len(lst)):
lst[i] = ''.join(lst[i])
# 使用set去重
l = list(set(lst))
# 返回排序的对象
return sorted(l)

if __name__ == "__main__":
a = Solution()
print a.Permutation("abc")


方法二:DFS

错误代码,由于li1列表中删除元素的时候对li2也产生了相应的修改

# -*- coding:utf-8 -*-

class Solution:
def Permutation(self, ss):
# write code here
if ss == "":
return []

x = len(ss)
vis = [0 for i in range(x)]
li1 = []
li2 = []
self.DFS(vis, ss, li1, li2, x)
# print li2
for i in range(len(li2)):
li2[i] = "".join(li2[i])
li2 = list(set(li2))
return sorted(li2)

def DFS(self, vis, ss, li1, li2, x):
if len(li1) == x:
li2.append(li1)
# print li2
return

for i in range(x):
if vis[i] == 0:
vis[i] = 1
li1.append(ss[i])
self.DFS(vis, ss, li1, li2, x)
vis[i] = 0
li1.pop()

if __name__ == "__main__":
a = Solution()
print a.Permutation("abc")


正确代码(注意类中全局变量的使用)

# -*- coding:utf-8 -*-

class Solution:
global li2
li2 = []
def Permutation(self, ss):
# write code here

global li2
if ss == "":
return []

x = len(ss)
vis = [0 for i in range(x)]
li1 = []
li2 = []
self.DFS(vis, ss, li1, x)
# print li2
for i in range(len(li2)):
li2[i] = "".join(li2[i])
li2 = list(set(li2))
return sorted(li2)

def DFS(self, vis, ss, li1,  x):

global li2
if len(li1) == x:
li = li1[::1]
li2.append(li)
# print li2
return

for i in range(x):
if vis[i] == 0:
vis[i] = 1
li1.append(ss[i])
self.DFS(vis, ss, li1,  x)
vis[i] = 0
li1.pop()
# print li2, "**"
return li2
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ACM python
相关文章推荐