题目描述:设计一个程序,当输入一个字符串时,要求输出这个字符串的所有排列。例如输入字符串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.递归一定要有结束条件,否则陷入死循环。
博客围绕设计程序求解字符串全排列展开。题目要求输入字符串输出其所有排列,采用递归法解答,如对字符串abc进行操作,还提及递归求解时要注意逐渐缩小问题规模、用同样方法解子问题,且递归需有结束条件,避免死循环。
&spm=1001.2101.3001.5002&articleId=88696598&d=1&t=3&u=e7ad12c62ec84e68a65069b7dd34e822)
1万+

被折叠的 条评论
为什么被折叠?



