算法思想
输入一个字符串,打印这个字符串中字符的全排列。
eg:
输入:abc
输出:abc acb bac bca cab cba
思路:将求字符串的全排列分解为两步:
第一步是确定第一个位置的字符,就是第一个位置与后边的所有字符进行交换。
第二步,就是对除了第一个位置的后边所有位置的字符进行相同处理;直至剩下一个字符,打印;
具体的算法流程如下
递归的出口,就是只剩一个字符的时候,递归的循环过程,就是从每个子串的第二个字符开始依次与第一个字符交换,然后继续处理子串,如果有重复的,然后对结果使用set去重就可以了
#具体代码
def perm(s=''):
if len(s) <= 1:
return [s]
sl = []
for i in range(len(s)):
for j in perm(s[0:i] + s[i + 1:]):
sl.append(s[i] + j)
return sl
def main():
# 可能包含重复的串
perm_nums = perm('abb')
# 对结果去重
no_repeat_nums = list(set(perm_nums))
print('perm_nums', len(perm_nums), perm_nums)
print('no_repeat_nums', len(no_repeat_nums), no_repeat_nums)
pass
if __name__ == '__main__':
main()
附上c语言实现
参考
http://www.cnblogs.com/liang1101/p/6376210.html
https://blog.csdn.net/xkx_1223_xkx/article/details/78002186
转载请注明出处:
CSDN:楼上小宇__home:http://blog.csdn.net/sty945