一、题目描述
输入一个字符串,打印该字符串中字符的所有排列。例如输入字符串“abc”,则输出“a”,“b”,“c”,所能够排列的所有字符串:“abc”,“acb”,“bac”,“bca”,“cab”,“cba”。
二、解法一:递归实现
递归的实现可以想成从局部到整体。字符串的全排列,最小的局部就是两个字符。两个字符不动输出一次,在交换输出一次,得到两个结果。多个字符的全排列,归根结底都是两个字符的移动,因此可以用递归的思想。可以固定前面字符,看最后两个的全排列,然后在最后三个的全排列,依次类推。
具体实现代码如下:
def swap(a, b):
return b, a
def CalcAllPermutation(s, start, end):
if(end <= 0):
return
if(start == end):
print (''.join(s))
for i in range(start, end+1):
s[start], s[i] = swap(s[start], s[i])
CalcAllPermutation(s, start+1, end)
s[start], s[i] = swap(s[start], s[i])
Python不像C/C++有指针,因此swap()要自己定义。for循环中的CalcAllPermutation(s, start+1, end)就是固定前边字符,一层层计算start+1到end的全排列,因此走到底,第一次计算的是最后两个字符的全排列,再是最后三个字符的全排列,…。
三、课后题
3.1字典序的所有排列
题目描述:已知字符串中的字符互不相同,现在把他们任意排列,如输入为“ab”,则输出的任意排列为:“aa”,“ab”,“bb”,“ba”。编程实现该功能。
**分析:**这个不是简单的全排列问题,跟全排列的形式有所区别。本题可以采用递归的思想,设置一个变量记录已输出的字符串的长度,达到了输出的长度就输出,反之继续往后输出字符。
参考代码如下:
def CalcAllPermutation(s, s_o, n, m):
if(n <= 0):
return
if(m == n):
print (''.join(s_o))
else:
for i in range(n):
s_o[m] = s[i]
CalcAllPermutation(s, s_o, n, m+1)
def main():
stra = input("Enter a string:")
stra = list(stra)
s_o = stra.copy()
CalcAllPermutation(stra , s_o, len(stra), 0)
未完待续。。。