字串的全排列
題目:輸入乙個字串,按字典序列印出該字串中字元的所有排列。例如輸入字串abc,則列印出由字元a,b,c所能排列出來的所有字串abc,acb,bac,bca,cab和cba。
分析:對於這個問題可以把字串分成兩個部分,一部分是字串的第乙個字元,另一部分是剩餘部分。即就是兩個步驟,1:求後面n-1個字元的全排列;2、把第乙個字元與後面字元分別交換。而求後面n-1個字元的排列也可採用該方法,所以可以遞迴實現為:
vector
permutation(string s)
void permutation(string s, int pbegin,vector
&str)
}}/*另一種一樣的方法
void permutation(char* str,char* pbegin)
if (*pbegin == '\0')
printf("%s\n ", str);
else
}} */
字串的組合
求輸入字元的組合,例如:輸入三個字元a、b、c則它們的組合有a、b、c、ab、ac、bc、abc。
分析:對於輸入n個字元,則這n個字元能夠構成長度為1、2、…、n的組合。在求長度為m的組合的時候,我們把這n個字元分成兩個部分:第乙個字元和其餘所有的字元。如果組合裡面包含第乙個字元,則就在剩餘字元裡面選取m-1個字元;如果組合裡面不包含第乙個字元,則就在剩餘字元裡面選取m個字元。即可分解成兩個子問題求n-1中m-1的組合和求n-1中的m組合。實現如下:
vector
combination(string s)
return result;
}void combination(string s,int pbegin,int num,vector
&str,vector
&result)
if(pbegin1,num,str,result);
str.push_back(s[pbegin]);
combination(s,pbegin+1,num-1,str,result);
str.pop_back(s[pbegin]);
}}
note :還可以使用next_permutation,是stl中提供的演算法,按字典序排列。
字串全排列拓展問題:
八皇后問題:在8×8的西洋棋上擺放八個皇后,使其不能相互攻擊,即任意兩個皇后不得處在同一行、同一列或者同一對角斜線上。下圖中的每個黑色格仔表示乙個皇后,這就是一種符合條件的擺放方法。請求出總共有多少種擺法。
分析:由於八個皇后的任意兩個不能處在同一行,那麼這肯定是每乙個皇后佔據一行。於是我們可以定義乙個陣列columnindex[8],陣列中第i個數字表示位於第i行的皇后的列號。先把columnindex的八個數字分別用0-7初始化,接下來我們要做的事情就是對陣列columnindex做全排列。由於我們是用不同的數字初始化陣列中的數字,因此任意兩個皇后肯定不同列。我們只需要判斷得到的每乙個排列對應的八個皇后是不是在同一對角斜線上,也就是陣列的兩個下標i和j,是不是i-j==columnindex[i]-column[j]或者j-i==columnindex[i]-columnindex[j]。
字串組合問題拓展:
輸入兩個整數n和m,從數列1,2,3…n中隨意取幾個數,使其和等於m,要求列出所有的組合。
void find_factor(int sum, int n,vector
&rec, vector
>&result)
rec.push_back(n);
find_factor(sum - n, n - 1,rec,result);//n放在裡面
rec.pop_back();
find_factor(sum, n - 1, rec, result);//n不放在裡面
}int main(void)
字串排列與組合
一 字串的排列 給定乙個字串,如何求出字串的所有排列。解題思路 字串的排列可以拆分成,第乙個字元和後面的字元進行組合而成,只需要變換第乙個字元,然後遞迴求後面的字元的排列即可,等到後面的字元為空的時候就得到一種字元的排列,下面是 實現 str 要排列的字串 pbegin 待排列的字串的起始位置,遞迴...
字串的排列與組合
求字串的排列可以把字串看成兩部分 第一部分為它的第乙個字元,第二部分是後面的所有字元。求字串的全排列的時候,可以用兩步完成 首先求所有可能出現在第乙個位置的字元,即把第乙個字元與後面的所有字元交換。第二步固定第乙個字元,求後面所有字元的排列。從中可以看出是典型的遞迴思路。字串的全排列 public ...
字串的全排列與組合
一 字串的排列 問題描述 給出乙個字串,請設計乙個函式輸出所有可能的排列,如abc,可能的排列順序有abc acb bac bca cba cab 問題分析 要對長度為n的序列進行排序,可以轉化為固定第乙個的值,再對剩餘的n 1個進行排序的問題,可以用遞迴實現。由於第乙個的值可以是任何乙個,可用第乙...