字串的排列(字串的組合,八皇后,正方體)

2021-08-30 15:35:29 字數 2331 閱讀 6765

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

輸入描述:輸入乙個字串,長度不超過9(可能有字元重複),字元只包括大小寫字母。

每次確定第一位的字母,將剩餘字母繼續組成乙個字串,再確定剩餘字串首字母,迴圈往復,便是遞迴。

class solution   

void helper(string str,string str1)

for(int i = 0;i < str.length();i++)

if(str[i] == str[i-1]) continue;

string tmp = str;

tmp.erase(tmp.begin()+i);

helper(tmp,str1+str[i]);

}}

};

第一種方法是在原字串中去掉某個字母,本方法是將首字母跟後方字母進行調換,以使每次首字母都不同,同樣是使用遞迴。

class solution 

void helper(string str,int pos)

for(int i = pos;i < str.length();i++)

}};

如果不是求字元的所有排列,而是求字元的所有組合,應該怎麼辦呢?還是輸入三個字元a、b、c,則它們的組合有a、b、c、ab、ac、bc、abc。當交換字串中的兩個字元時,雖然能得到兩個不同的排列,但卻是同乙個組合。比如ab和ba是不同的排列,但只算乙個組合。

對於n個字串,從1個字元到n個字元的組合m,可以拆分為兩種情況:1.選擇頭部,從剩下n-1個中選m-1個  2.不選擇頭部,從剩下n-1個總選m個。於是可以試用遞迴。

class solution

return res;

}void helper(string str,int num,string tmp)

return;

}if(str.length() == 0 && num > 0)

string s = str;

s.erase(s.begin());

helper(s,num,tmp);

helper(s,num-1,tmp+str[0]);

}};

每次對每一位加入或者不加入字串中,相當於窮舉所有情況,最後判斷是否已儲存進結果進而去重。

class solution

void helper(string str,string str1)

}return;

}string t = str;

t.erase(t.begin());

helper(t,str1);

helper(t,str1+str[0]);

}};

輸入乙個含有8個數字的陣列,判斷有沒有可能把這8個數字分別放到正方體的8個頂點上,使得正方體上三組相對的面上的4個頂點的和都相等。

思路:同樣是對於8個定點,定義乙個陣列,進行全排列,每次確定第乙個元素,然後對剩下元素進行遞迴。排列完後進行判斷。

在8×8的西洋棋上擺放8個皇后,使其不能相互攻擊,即任意兩個皇后不得處在同一行、同一列或者同一對角線上。請問總共有多少種符合條件的擺法?

解題思路:

8個皇后的任意兩個不能處在同一行,那麼肯定是每乙個皇后佔據一行。於是我們可以定義乙個陣列columnindex[8],陣列中第i個數字表示位於第i行的皇后的列號。先把陣列columnindex的8個數字分別用0~7初始化,接下來就是對陣列columnindex做全排列。因為我們是用不同的數字初始化陣列,所以任意兩個皇后肯定不同列。我們只需判斷每乙個排列對應的8個皇后是不是在同一對角線上,也就是對於陣列的兩個下標i和j,是不是i-j=columnindex[i]-columnindex[j]或者j-i=columnindex[i]-columnindex[j]。

同樣是全排列,排列完後確定是否可行(或者一變排一遍檢測,如果不可行則直接退出)。

#include using namespace std;

class solution

void findres(int* column)

void helper(int* column,int pos)}}

if(jug)

cout

}for(int i = pos;i < 8;i++)

}};int main()

; s.findres(column);

return 0;

}

字串的排列 組合

遞迴方法 1 全排列 面試題28 字串的排列 從集合依次選出每乙個元素,作為排列的第乙個元素,然後對剩餘的元素進行全排列,如此遞迴處理 n個數的全排列,一共有n!種情況.n個位置,第乙個位置有n種,當第乙個位置固定下來之後,第二個位置有n 1種情況.全排列的過程 選擇第乙個字元 獲得第乙個字元固定下...

字串的排列與組合

求字串的排列可以把字串看成兩部分 第一部分為它的第乙個字元,第二部分是後面的所有字元。求字串的全排列的時候,可以用兩步完成 首先求所有可能出現在第乙個位置的字元,即把第乙個字元與後面的所有字元交換。第二步固定第乙個字元,求後面所有字元的排列。從中可以看出是典型的遞迴思路。字串的全排列 public ...

字串的排列組合

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