算法习题---字符串的全排序列

一:什么是全排列

排列:从n个元素中任取m个元素,并按照一定的顺序进行排列,称为排列;

全排列:当n==m时,称为全排列;

比如:集合{ 1,2,3}的全排列为:

{ 1 2 3}

{ 1 3 2 }

{ 2 1 3 }

{ 2 3 1 }

{ 3 2 1 }

{ 3 1 2 }

我们可以将这个排列问题画成图形表示,即排列枚举树,比如下图为{1,2,3}的排列枚举树,此树和我们这里介绍的算法完全一致;

二:全排列实现思路

(1)n个元素的全排列=(n-1个元素的全排列)+(另一个元素作为前缀);

(2)出口:如果只有一个元素的全排列,则说明已经排完,则输出数组;

(3)不断将每个元素放作第一个元素,然后将这个元素作为前缀,并将其余元素继续全排列,等到出口,出口出去后还需要还原数组;

三:代码实现

//str是字符串,n是由n个不同字符串组成,k是处理下标从0-k的所有字符串进行全排列
void perm(char str[], int k, int n)
{
    int i, j;
    char temp;
    if (k==0)    //输出排列完毕的字符串
    {
        for (j = 0; j <= n - 1; j++)
            printf("%d", str[j]);
    }
    else
    {
        for (i = 0; i <= k;i++)    //对每一个字符尝试一次做第一个排序字符
        {
            temp = str[k];    //交换,将每一个元素放在最后
            str[k] = str[i];
            str[i] = temp;

            perm(str, k - 1, n);

            temp = str[i];    //打印完毕,将数组还原
            str[i] = str[k];
            str[k] = temp;
        }
    }
}

原文地址:https://www.cnblogs.com/ssyfj/p/9573019.html

时间: 2024-10-09 05:39:55

算法习题---字符串的全排序列的相关文章

百度的一道二面算法题分析:补全括号序列

算法题:补全括号序列 百度二面遇到的一个问题 大概意思就是 给出一个中括号序列,在序列前后可以加中括号字符,补全它... 当时没想起来解决办法,然后凉凉了,后来专门去搞了这道题,终于搞定 思路在注释里写的比较详细了,此处不再赘述(用了类似栈的思想) <?php /** * 字符串转数组 * @param $str string 输入的字符串 * @return array 转换之后的结果数组 */ function strToArray($str) { // 强制转换为字符串 $str = (s

对聚集表查询的时候,未显式指定排序列的时候,默认查询结果的顺序一定是按照聚集索引顺序排序的吗

在sql server 中,如果一张表存在聚集索引的时候,大多数情况下,如果进行select * from TableName查询,默认的返回顺序是按照聚集所在列的顺序返回的 但是,在一张表存在聚集索引的时候,并不一定所有的情况都是按照聚集索引列的顺序排列的, 下面开始测试 create table TestDefaultOrder ( Id int identity(1,1) primary key,--主键上默认会建立聚集索引 Col2 char(5), COL3 char(5) ) --写

经典白话算法之二叉树中序前序序列(或后序)求解树

这种题一般有二种形式,共同点是都已知中序序列.如果没有中序序列,是无法唯一确定一棵树的. <1>已知二叉树的前序序列和中序序列,求解树. 1.确定树的根节点.树根是当前树中所有元素在前序遍历中最先出现的元素. 2.求解树的子树.找出根节点在中序遍历中的位置,根左边的所有元素就是左子树,根右边的所有元素就是右子树.若根节点左边或右边为空,则该方向子树为空:若根节点 边和右边都为空,则根节点已经为叶子节点. 3.递归求解树.将左子树和右子树分别看成一棵二叉树,重复1.2.3步,直到所有的节点完成定

Oracle中如何判断字符串是否全为数字

Oracle中如何判断字符串是否全为数字 学习了:http://www.cnblogs.com/zrcoffee/archive/2012/12/11/2812744.html 本文介绍了判断字符串是否全为数字的4种办法,另外还介绍了一个translate函数的小技巧,从任意字符串中提取数字(调用2次translate函数).这个办法是一个公司同事发现的,用起来很方便,但理解起来稍有点困难.1.通过ASCII码判断是否数字,介于[48, 57]之间,(ascii('0') = 48, ascii

关于全排的递归算法

注:该方法转自 李宁的极客世界 在做leetcode的时候遇到一道关于全排的题,于是去了解了有关的递归算法 思路: 1.首先看最后两个数4, 5. 它们的全排列为4 5和5 4, 即以4开头的5的全排列和以5开头的4的全排列. 由于一个数的全排列就是其本身,从而得到以上结果. 2.再看后三个数3, 4, 5.它们的全排列为3 4 5.3 5 4. 4 3 5. 4 5 3. 5 3 4. 5 4 3 六组数. 即以3开头的和4,5的全排列的组合.以4开头的和3,5的全排列的组合和以5开头的和3,

一篇文章带你了解JavaScript中的基础算法之“字符串类”

作者 | Jeskson 来源 | 达达前端小酒馆 1 算法可以干什么呢?提高什么?有什么好处呢? 前端的同学需要提升编程核心内功,建立和健全算法知识体系,基础算法.数据结构.进阶算法,由浅入深讲解,透彻理解抽象算法,算法面试是关键一环,冲击大厂前端offer. 学习算法前掌握ES6哦!需要掌握单元测试的语言,Jest Jest is a delightful JavaScript Testing Framework with a focus on simplicity. It works wi

算法 输出字符串字符的任意组合

编程列出一个字符串的全字符组合情况,原始字符串中没有重复字符,例如: 原始字符串是"abc",打印得到下列所有组合情况: "a" "b" "c" "ab" "bc" "ca" "ba" "cb" "ac" "abc" "acb" "bac" &quo

[算法]将字符串中的*前置,非*字符相对位置不变

如ab**cd*e12变成 ****abcde12 char* foo(char* str, int length){ int i = length-1,j = length-1; while(i >= 0 && j >= 0){ while(i >= 0 && '*' != str[i]){ --i; } j = i - 1; while(j >= 0 && '*' == str[j]){ --j; } if(j >= 0){

jquery easyui datagrid 排序列

点击排序列,将获取参数有:page=1&rows=10&sort=UserName&order=desc c#后台获取sort跟order参数 string sortColumn = Request.Params["sort"].ToString(); string order = Request.Params["order"].ToString(); jquery easyui datagrid 排序列,布布扣,bubuko.com