字符全排列

问题一:对字符串s,输出字符串S中字符的所有排列。例如:输入字符串"abc",其全排列是abc,acb,bac,bca,cab,cba;

方法一:这是一个深度优先搜索的过程。

void dfs(vector<string> &result,string & path,string s,int len)
{
    if(len==s.size())
    {
        result.push_back(path);
        return;
    }
    for(int i=0;i<s.size();i++)
    {
        if(path.find(s[i])==-1)
        {
            path.push_back(s[i]);
            dfs(result,path,s,len+1);
            path.pop_back();
        }
    }
}
int main()
{
    string str="abc";
    vector<string> result;
    string path;
    dfs(result,path,str,0);
}

方法二:递归的过程:首先求所有可能出现在第一个位置的字符,也就是把第一个字符与后面的所有字符交换。其次,固定第一个字符,求后面字符的全排列,也就是把第二个字符与后面的所有字符交换。一直递归下去。

void permutation(char *s,char *sbegin)
{
    if(*sbegin==‘\0‘)
        cout<<s<<endl;
    else
    {
        for(char *p=sbegin;*p!=‘\0‘;p++)
        {
            swap(*sbegin,*p);
            permutation(s,sbegin+1);
            swap(*sbegin,*p);
        }
    }
}
int main()
{
    char s[]="abc";
    permutation(s,s);
}

时间: 2024-10-11 05:58:08

字符全排列的相关文章

算法笔记_025:字符串的全排列(Java)

目录 1 问题描述 2 解决方案 2.1 递归实现 2.2 字典序排列实现   1 问题描述 输入一个字符串,打印出该字符串的所有排列.例如,输入字符串"abc",则输出有字符'a','b','c'所能排列出来的所有字符串"abc","acb","bac","bca","cab","cba". 2 解决方案 2.1 递归实现 从字符串中选出一个字符作为排列的第一个字符

字符串的全排列-递归算法

题目:给定字符串S[0...N-1],设计算法,枚举S的全排列. 假设字符串为“1234”,首先考虑1,然后问题就变成了考虑“234”的全排列,所以问题规模缩小了1,然后再考虑2,依次类推.可以采用递归算法. 1-234 2-134 3-124 4-123 假设有重复字符,则重复字符的全排列就是每个字符分别与它后面非重复出现的字符交换. 1 #include <iostream> 2 #include <string> 3 4 using namespace std; 5 6 //

字符串相关操作

字符串的操作多用用就行了. 在字符串相关操作中,进行字面值的处理需要用库函数,"="操作的是存储字符串的地址(基本类型). 1.C中字符串的赋值 2.C中字符串长度和大小比较 3.C中字符串拼接 4.C中字符串的拆分 4.C中字符串与其他类型转化 sprintf()->其他格式转成字符串  和 sscanf()->字符串转成其他格式; 几个小练习: 1.字符串中去掉重复的字母: int judge[52]={0}; string derepeat(string str){

poj-1146 ID codes

Description It is 2084 and the year of Big Brother has finally arrived, albeit a century late. In order to exercise greater control over its citizens and thereby to counter a chronic breakdown in law and order, the Government decides on a radical mea

经典算法学习之分治法(以排列、组合程序为例)

分治法的思想:将原问题分解为几个规模较小但类似于原问题的子问题,递归的求解这些子问题,然后再合并这些子问题的解来建立原问题的解. 分治法在每层递归是遵循的三个步骤: (1)分解原问题为若干个子问题,这些子问题是原问题的规模较小的实例. (2)解决这些子问题,队规的求解各个子问题,当子问题规模足够小的时候,直接求解. (3)合并这些子问题的解构成原问题的解. 显然归并排序是一个非常经典规矩的分治法的例子,鉴于之前已经写过一篇关于归并排序的博文,这里不在使用归并排序作为例子. 注意分治法的每一层递归

2012-10-9杭州阿里巴巴研发笔试题目

1.参考答案:C. 2.参考答案:D. 解析:对于8位二进制数,对于一个负数,|原码| + 补码 = 1 0000 0000, 所以如果求补码 = 1 0000 0000 - |原码|同理,对于4位三进制数,对于一个负数,|原码| + 补码 = 1 0000, 所以如果求补码 = 1 0000 - |原码|对于这道题,|-10|三进制为0101,则其补码 = 1 0000 - 0101 = 2122, 所以选D 3.参考答案:A. 4.参考答案:B. 解析:假设进程为A.B.C,最大可申请的资源

字符串的排列和组合问题

1.字符串的全排列 题目:{a,b,c}要求输出{abc,acb,bac,bca,cab,cba}. 字符串全排列可以把字符串看成两个部分,第一个部分为它的一个字符,第二部分是后面的字符. 分两步完成:首先求所有可能出现在第一个位置的字符,即把第一个字符与后面的所有字符交换.第二步固定第一个字符,求后面所有字符的排列.从中可以看出是典型的递归思路. 1 public void helper(char[] array, int cur){ 2 if ( cur == array.length -

求n个数的排列

如果给定N个不同字符,将这N个字符全排列,最终的结果将会是N!种.如:给定 A.B.C三个不同的字符,则结果为:ABC.ACB.BAC.BCA.CAB.CBA一共3!=3*2=6种情况. public class Test6 { //设置总数 private static int count =0;public static void main(String[] args) { //获取 Scanner s = new Scanner(System.in); int n = s.nextInt(

剑指Offer对答如流系列 - 把数组排成最小的数

面试题45:把数组排成最小的数 题目描述 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.例如输入数组{3, 32, 321},则打印出这3个数字能排成的最小数字321323. 问题分析 之前我们做过字符全排列的习题 剑指Offer对答如流系列 - 字符串的排列,但是将算法思想应用到这一题的话,效果不好,求出所有的组合,再计算出组合的最小值,这效率该多低啊. 我们还要进一步探究,看看有没有不错的规律,供我们使用. 因为数字拼接后的长度一样,拼接后的结果