zoukankan      html  css  js  c++  java
  • 字符全排列

    题目描述:

    输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则输出由字符a、b、c所能排列出来的所有字符串abc、acb、bac、bca、cab和cba。

    解析:

    递归法:

    • 首先看最后两个字符b, c。 它们的全排列为b c和c b, 即以b开头的c的全排列和以c开头的b的全排列。
    • 再看三个字符a,b,c。他们的全排列(a,b,c)、(a,c,b)、(b,a,c)、(b,c,a)、(c,a,b)、(c,b,a)

    从而可以推断,设一组数p = {r1, r2, r3, ... ,rn}, 全排列为perm(p),pn = p - {rn}。因此perm(p) = r1perm(p1), r2perm(p2), r3perm(p3), ... , rnperm(pn)。当n = 1时perm(p} = r1。为了更容易理解,将整组数中的所有的数分别与第一个数交换,这样就总是在处理后n-1个数的全排列。

    代码:(下面的输入以(a,b,c,d)为例)

    #include <iostream>
    
    using namespace std;
    
    void swap(char *x, char *y)
    {
        int temp;
        temp = *x;
        *x = *y;
        *y = temp;
    }
    
    void perm(char *list, int i, int max)
    {
        if(i > max)
        {
            for(int j = 0; j <= max; j++)
            {
                cout << list[j] << " ";
            }
            cout << endl;
        }
        else
        {
            for(int j = i; j <= max; j++)
            {
                swap(&list[i], &list[j]);
                perm(list, i+1, max);
                swap(&list[i], &list[j]);
            }
        }
    }
    
    
    
    int main()
    {
        char list[4] = {'a', 'b', 'c', 'd'};
        perm(list,0,3);
    
        return 0;
    }


    输出结果:

  • 相关阅读:
    stm32学习(一)
    linux驱动之ioctl
    request_threaded_irq()参数
    驱动初步学习
    linux命令操作
    Shell
    进程模块管理
    bash及正规表示法
    python脚本
    Python系统模块os
  • 原文地址:https://www.cnblogs.com/biyeymyhjob/p/2694984.html
Copyright © 2011-2022 走看看