题目描述:设计一个程序,当输入一个字符串时,要求输出这个字符串的所有排列。例如输入字符串abc,要求输出由字符a.b.c所能排列的所有字符串:abc, acb,bac,bca,cba,cab
分析与解答:可以用递归和非递归的方法来求解,本题使用递归法:1.首先固定第一个字符,既交换a与b,然后固定第一个字符b,接着对后面的两个字符a与c进行全排列。2.交换第一个字符与后面的字符,既交换a与b,然后固定第一个字符b,接着对后面的两个字符a与b进行全排列。3.由于第2步交换了a和b破坏了字符串原来的顺序,因此,需要再次交换a和b使其恢复原来的顺序,然后交换第一个字符与第三个字符(交换a与c),接着固定第一个字符c,对后面的两个字符a与b求全排列。
def swap(str, i , j):
"""交换数组下标为i和j对应的字符"""
tmp = str[i]
str[i] = str[j]
str[j] = tmp
# 对字符串中的字符进行全排列
def Permutation(str, start):
if str == None or start < 0:
return
# 完成全排队后输出当前排列的字符串
if start == len(str) - 1:
print("".join(str))
else:
i = start
while i < len(str):
# 交换start与i所在位置的字符
swap(str, start, i)
# 固定第一个字符,对其余字符进行全排列
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)
在使用递归方法求解的时候,应该注意两点,1.逐渐缩小问题的规模。并且可以用同样的方法来求解子问题;2.递归一定要有结束条件,否则陷入死循环。