28 - 字符串的全排列和组合

字符串的排列

题目描述:http://ac.jobdu.com/problem.php?pid=1369

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



分两步:

第一步:求所有可能出现在第一个位置的字符,即把第一个字符和后面所有的字符都交换一次

第二步:固定第一个位置的字符,求后面所有字符的排列

终止条件:当要求固定位置的字符为’\0’时,说明已经排列到字符串尾

#include <iostream>
using namespace std;
void swap(char*c1, char* c2) {
    char temp = *c1;
    *c1 = *c2;
    *c2 = temp;
}
void Permutaion(char* pStr, char* pBegin) {
    if (*pBegin == ‘\0‘) {
        cout << pStr << endl;
        return;
    }
    for (char* p = pBegin; *p != ‘\0‘; p++) {
        swap(pBegin, p); // 交换pBegin位置和p位置
        Permutaion(pStr, pBegin+1); // 固定begin,对pBegin+1排列
        swap(pBegin, p); // 交换回来
    }
}
void Permutaion(char* pStr) {
    if (pStr == NULL)
        return;
    Permutaion(pStr, pStr);
}
int main() {
    char s[] = "abc";
    Permutaion(s);
}

字符串的组合

输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能组合出来的所有字符串a, b, c, ab, ac, bc, abc



求n个字符的长度为m的字符组合:

将n个字符分成两个部分,第一个字符和其余所有字符

  • 如果组合包含第一个字符,则在剩下的n-1个字符中,选 m-1
  • 如果组合不含第一个字符,则在剩下的n-1个字符中,选 m
#include <iostream>
#include <vector>
using namespace std;
void PrintVector(const vector<char> &v) {
    for (vector<char>::const_iterator iter = v.begin(); iter != v.end(); iter++)
        cout << *iter;
    cout << endl;
}
// 从n个字符中找出m个字符的组合
void Combination(char* pStr, int m, vector<char> &v) {
    if (m == 0) {
        PrintVector(v);
        return;
    }
    if (*pStr == ‘\0‘ || m < 0)
        return;
    // 组合包含此字符,在剩下的字符中选m-1个
    v.push_back(*pStr);
    Combination(pStr+1, m-1, v);
    // 组合不包含此字符,在剩下的字符中选m个
    v.pop_back();
    Combination(pStr+1, m, v);
}
void Combination(char* pStr, int n) {
    if (pStr == NULL)
        return;
    vector<char> v;
    for (int i = 1; i <= n; i++)
        Combination(pStr, i, v); // 确定组合的长度
}
int main() {
    char s[] = "abc";
    Combination(s, sizeof(s)/sizeof(s[0]));
}

其他相关问题

正方体和八皇后的问题:

求字符的所有组合和所有排列 http://www.wengweitao.com/qiu-zi-fu-de-suo-you-zu-he-he-suo-you-pai-lie.html

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-09 06:54:09

28 - 字符串的全排列和组合的相关文章

28. 字符串的全排列之第2篇[string permutation with repeating chars]

[本文链接] http://www.cnblogs.com/hellogiser/p/string-permutation-with-repeating-chars.html [题目] 输入一个字符串,打印出该字符串中字符的所有排列.例如输入字符串abc,则输出由字符a.b.c所能排列出来的所有字符串abc.acb.bac.bca.cab和cba.例如输入字符串aba,则输出由字符a.b所能排列出来的所有字符串aab.aba.baa. [分析] 之前的博文28.字符串的排列之第1篇[String

《编程之法》1.3字符串的全排列,组合,重复排列,八皇后问题

题目描述:输入一个字符串,打印出该字符串中字符的所有排列,例如输入"abc",输出"abc","acb","bac","bca","cab","cba" 解法一:递归实现 类似于图的深度遍历搜索求全路径的算法,每次交换两个数,并输出,按照递归的方法,如求abcd的全排序,1:先求abcd后面的bcd全排列(同样先求b后面cd的全排列,然后b与后面的元素依次交换);2:

字符串的全排列与组合

一.字符串的排列 问题描述:给出一个字符串,请设计一个函数输出所有可能的排列,如abc,可能的排列顺序有abc.acb.bac.bca.cba.cab  问题分析:要对长度为n的序列进行排序,可以转化为固定第一个的值,再对剩余的n-1个进行排序的问题,可以用递归实现.由于第一个的值可以是任何一个,可用第一个值与其他值依次交换实现.如序列abc可以转化为如下三种情况: (1)第一个固定为a,对bc进行排序 (2)第一个固定为b,对ac进行排序 (3)第一个固定为c,对ab进行排序 代码: 二.字符

字符串数组全排列——逐个追加组合算法

我们在笔试面试过程中经常会遇到关于排列与组合的问题,其实这些可以通过递归简单的实现,看下面两个例子: (1)关于字符串排列的问题 输入一个字符串,打印出该字符串中字符的所有排列.例如输入字符串abc,则输出由字符a.b.c所能排列出来的所有字符串abc.acb.bac.bca.cab和cba. 可以这样想:固定第一个字符a,求后面两个字符bc的排列.当两个字符bc的排列求好之后,我们把第一个字符a和后面的b交换,得到bac;接着我们固定第一个字符b,求后面两个字符ac的排列.现在是把c放到第一位

字符串全排列和组合算法

打印字符串的全排列 算法的思路: 把一个字符串分成两部分,第一个字符+后面部分所有的字符.这样就能够递归的求解整个过程了: 1.每个字符都做一次首字符 2.当某个字符作为首字符的时候,求后面所有字符的全排列 而这里的求后面所有字符的全排列可以看成递归的子问题 全排列的递归树: 但是这里还有一个问题,那就是字符串中有重复的字符时,这样的算法会增加最后的结果数目.比如说字符串aab,a+ab的全排列,然后交换还是a+ab的全排列.所以会增加结果的数目.解决方案就是:当遇到重复的字符的时候就跳过去,不

字符串的排列和组合问题

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

全排列,组合问题

(1)全排列问题 1 //全排列的两种方法 2 #include <iostream> 3 using namespace std; 4 5 //方法一,采用swap方法 6 void quanpailie(char * A,int first,int n) 7 { 8 if(A==NULL) 9 { 10 cout<<"A is NULL"<<endl; 11 return; 12 } 13 if(n<=1) 14 { 15 cout<

字符串的全排列(java)

差不多半个月没写博客了,今天再写一篇. 字符串全排列相信大家都不陌生,对于我来说真的是写了又忘,忘了又写,所以决定写成一篇博客,废话不多说下面我来分析问题: 问题描述:给定一个字符串写出它的全排列,例如ab,全排列是ab,ba,而abc的全排列abc,acb,bac,bca,cab,cba. 解题思路:我们以具体例子分析,假如abc,如上所示,它的全排列是不是就是把字符串中每一个字符,放在第一位,然后再对剩下的字符串做全排列,如把a放在第一位,剩下bc 全排列是bc,cb,组合起来就是abc,a

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

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