编程之法面试和算法心得-1.3字符串的全排列

一、题目描述

输入一个字符串,打印该字符串中字符的所有排列。例如输入字符串“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)

未完待续。。。

猜你喜欢

转载自blog.csdn.net/qq_21578849/article/details/84452277
今日推荐