1. 程式人生 > >字串的全排列與組合

字串的全排列與組合

題目描述:
輸入一個字串,打印出該字串中字元的所有排列。
基本思路:
從字串中選出一個字元作為排列的第一個字元,然後對剩餘的字元進行全排列,如此遞迴,從而得到所有字元的全排列。以對字元”abc”進行全排列為例,可以按下述步驟執行:
將a固定在第一位,求後面bc的排列
將b固定在第一位,求後面ac的排列
將c固定在第一位,求後面ab的排列

#include<stdio.h>
#include<stdlib.h>
#define swap(t,x,y) (t = (x),x = (y),y = (t))
void CalcAllPermutation(char
*perm,int from,int to) { if (to < 0) return ; int i = 0; char t; if (from == to) { for (i = 0;i <= to;i++) printf("%c",perm[i]); printf("\n"); } else { for (i = from;i <= to;i++) { swap(t,perm[i],perm[from
]);//將from-to中的一個元素固定在第一位 CalcAllPermutation(perm,from+1,to); swap(t,perm[i],perm[from]);//恢復以前的狀態 } } } int main() { char s[] = "abcd"; CalcAllPermutation(s,0,3); return 0; }

執行結果(centos5.5)
[[email protected] ~]# ./a.out
abcd
abdc
acbd
acdb
adcb
adbc
bacd
badc
bcad
bcda
bdca
bdac
cbad
cbda
cabd
cadb
cdab
cdba
dbca
dbac
dcba
dcab
dacb
dabc
題目:輸入一個字串,輸出該字串中字元的所有組合。舉個例子,如果輸入abc,它的組合有a、b、c、ab、ac、bc、abc。
上面我們詳細討論瞭如何用遞迴的思路求字串的排列。同樣,本題也可以用遞迴的思路來求字串的組合。
假設我們想在長度為n的字串中求m個字元的組合。我們先從頭掃描字串的第一個字元。針對第一個字元,我們有兩種選擇:第一是把這個字元放到組合中去,接下來我們需要在剩下的n-1個字元中選取m-1個字元;第二是不把這個字元放到組合中去,接下來我們需要在剩下的n-1個字元中選擇m個字元。這兩種選擇都很容易用遞迴實現。下面是這種思路的參考程式碼:


#include<iostream>
#include<vector>
#include<cstring>
using namespace std;
#include<assert.h>

void Combination(char *string ,int number,vector<char> &result);

void Combination(char *string)
{
    assert(string != NULL);
    vector<char> result;
    int i , length = strlen(string);
    for(i = 1 ; i <= length ; ++i)
        Combination(string , i ,result);
}

void Combination(char *string ,int number , vector<char> &result)
{
    assert(string != NULL);
    if(number == 0)
    {
        static int num = 1;
        printf("第%d個組合\t",num++);

        vector<char>::iterator iter = result.begin();
        for( ; iter != result.end() ; ++iter)
            printf("%c",*iter);
        printf("\n");
        return ;
    }
    if(*string == '\0')
        return ;
    result.push_back(*string);
    Combination(string + 1 , number - 1 , result);
    result.pop_back();
    Combination(string + 1 , number , result);
}

int main(void)
{
    char str[] = "abc";
    Combination(str);
    return 0;
}

執行結果如下:(centos5.5)
[[email protected] ~]# ./a.out
第1個組合 a
第2個組合 b
第3個組合 c
第4個組合 ab
第5個組合 ac
第6個組合 bc
第7個組合 abc

相關推薦

字串排列組合的遞迴實現-Java版

排列組合演算法用途廣泛, 需要掌握, 為降低門檻, 本文主要關注演算法的邏輯和簡易性, 未重視演算法效率. 結合網路書本上的實現和自己的需求, 這裡列有四個目標: 1. 所有元素的全排列: ab的全排列是ab, ba(順序相關); 2. 所有元素的全組合:

字串排列組合

題目描述: 輸入一個字串,打印出該字串中字元的所有排列。 基本思路: 從字串中選出一個字元作為排列的第一個字元,然後對剩餘的字元進行全排列,如此遞迴,從而得到所有字元的全排列。以對

javascript 字串排列組合

不重複字串的組合 輸入 輸出 沒有重複值的字串 所有可能的組合值 abc a,b,c,ab,bc,abc 思路 遞迴的思

字串排列組合

字串的全排列 題目:輸入一個字串,按字典序打印出該字串中字元的所有排列。例如輸入字串abc,則打印出由字元a,b,c所能排列出來的所有字串abc,acb,bac,bca,cab和cba。 分析:對於這個問題可以把字串分成兩個部分,一部分是字串的第一個字元,另

【劍指offer】字串排列組合

【1、字串排列】 【題目】 輸入一個字串,按字典序打印出該字串中字元的所有排列。例如輸入字串abc,則打印出由字元a,b,c所能排列出來的所有字串abc,acb,bac,bca,cab和cba。

排列組合

gpo {} ret == AI concat com all cti //全排列 var arr = ["a", "b", "c", "d"]; //實現全排列 function AllPermuAndCombi(arr,length){ var

[收集]字串排列組合

今天學習了一下何海濤部落格中的第28題,字串的排列問題,實際上指的是字串的全排列問題(排列和全排列還是有區別的吧)。思考並研究了這題之後就考慮了一下不同條件下其他類似的題的解法的編寫,兩部分來自於何海濤,其他來自於網路,此處做搬運和收集工作。分別從四個方面考慮:一、字串的全

字串排列組合演算法(遞迴非遞迴)

全排列在筆試面試中很熱門,因為它難度適中,既可以考察遞迴實現,又能進一步考察非遞迴的實現,便於區分出考生的水平。所以在百度和迅雷的校園招聘以及程式設計師和軟體設計師的考試中都考到了,因此本文對全排列作下總結幫助大家更好的學習和理解。對本文有任何補充之處,歡迎大家指出。

排列組合的一些定理

事物 規劃 四種 zoom org hellip com vpc assume 一,加法原理與乘法原理 加法原理與乘法原理是排列與組合的基礎。加法原理本質上是分類,乘法原理本質上是分步。 分類,就是把一個集合(某事物)分成互不相交的若幹獨立的部分。比如,概率論中的全概率

排列組合

sub AC CQ quad 概率 選擇 步驟 就是 第一步 組合就是一個蘿蔔一個坑。排序就是在坑的基礎上,給蘿蔔排排坐。 首先了解兩個基本計數原理: 加法原理:(分類) 完成一件事有k種方式,第i種方式有ni種方法,則完成該事件的方法總數為n1+n2+..+nk

演算法筆記_排列N皇后問題

說明:這裡的全排列是按字典序的. 以下給出從1到3的全排列程式碼: #include<iostream> #include<stdlib.h> using namespace std; const int maxn = 11; //P為當前排列,hashTable記錄

C語言版 輸出字串排列

問題:輸入一字串(要求不存在重複字元),打印出該字串中字元中字元的所有排列。  例如:輸入”abc”,輸出結果為abc, acb, bac, bca, cab和cba。 遇到這個問題,筆者搜了一下,網上有很多答案,但似乎沒有我想要的簡單一點的純C語言編寫的,所以自己動手寫了

字串排列(效能分析Java版)

具體的思路我就不寫了,借用網上的一張圖來表示: 我的程式碼如下: import java.util.*; public class Solution { public ArrayList<String> Permutation(String str

排列組合演算法演示

排列組合是計算機常用演算法,現在專門用一個小程式演示說明一下: 01 組合演算法 /* 程式說明:實現組合邏輯,即實現從N個元素中取出M個元素 */ #define MAX_LEN 1024 int top = 0; int que[MAX_LEN]; int

階乘、排列組合

排列組合 排列組合是組合學最基本的概念。所謂排列,就是指從給定個數的元素中取出指定個數的元素進行排序。組合則是指從給定個數的元素中僅僅取出指定個數的元素,不考慮排序。 Python程式碼實現 功能一:

8.4-字串排列

Write a method to compute all permutations of a string 其實就是全排列。 #include <iostream> #include <vector> #include <string>

E. Stack Sorting Codeforces(排列棧輔助排序)

Educational Codeforces Round 35 (Rated for Div. 2) E. Stack Sorting time limit per test 2 seconds memory limit per test 256 megaby

Java實現字串的排序組合-詳細分析實現過程

劍指Offer_24 字串的排序 2018/6/19 星期二 題目描述 輸入一個字串,按字典序打印出該字串中字元的所有排列。例如輸入字串abc,則打印出由字元a,b,c所能排列出來的所有字串abc,acb,bac,bca,cab和cba。 輸入描述

五十道程式設計小題目 --- 11 排列組合(階乘) java

package wn.comeOn.java.test.arithmetic50; import java.util.ArrayList; public class Arrangement { // 階乘 public static int factorial(int n) { if (n

java字串排列問題(經典)

*原題如下:用1、2、2、3、4、6這六個數字,用java寫一個main函式,打印出所有不同的排列, *如:612234、412346等,要求:”4”不能在第三位,”3”與”6”不能相連. * *1把問題歸結為圖結構的遍歷問題。實際上6個數字就是六個結點,