輸出一個字串的全排列(C++)
阿新 • • 發佈:2019-02-19
/* 實現方法: 對於一個字串"abc"輸出它的全排列,第一個字元應該分別為a,b,c;第二個字元,後面應該是除去已輸出部分的剩餘部分的全排列。 即對於"abc", 輸出 a,輸出"abc"除去'a'的全排列; 輸出 b,輸出"bc"除去'b'的全排列; 輸出 c,輸出"bc"除去'c'的全排列; 輸出 b,輸出"abc"除去'b'的全排列; 輸出 c,輸出"abc"除去'c'的全排列; 所以一個遞迴的實現方法是: void permutation(已輸出部分,全部除去已輸出部分) if 全部除去已輸出部分!=空 for letter in 全部除去已輸出部分 已輸出部分:append letter 全部除去已輸出部分:remove letter permutation(已輸出部分,全部除去已輸出部分) end for else 輸出 已輸出部分 */ #include <iostream> #include <list> #include <iterator> using namespace std; void permutation(list<char> pre, list<char> str) { if (!str.empty()) { for (list<char>::iterator it = str.begin(); it != str.end(); ++it) { list<char> curPre(pre); list<char> templist(str.begin(), str.end()); curPre.push_back(*it); templist.remove(*it); permutation(curPre, templist); } } else { copy(pre.begin(), pre.end(), ostream_iterator<char>(cout, "")); cout << endl; } } int main() { char* alphabet = "ABCDE"; list<char> str(alphabet, &alphabet[5]); permutation(list<char>(), str); return 0; } // Output: /* ABCDE ABCED ABDCE ABDEC ABECD ABEDC ACBDE ACBED ACDBE ACDEB ACEBD ACEDB ADBCE ADBEC ADCBE ADCEB ADEBC ADECB AEBCD AEBDC AECBD AECDB AEDBC AEDCB BACDE BACED BADCE BADEC BAECD BAEDC BCADE BCAED BCDAE BCDEA BCEAD BCEDA BDACE BDAEC BDCAE BDCEA BDEAC BDECA BEACD BEADC BECAD BECDA BEDAC BEDCA CABDE CABED CADBE CADEB CAEBD CAEDB CBADE CBAED CBDAE CBDEA CBEAD CBEDA CDABE CDAEB CDBAE CDBEA CDEAB CDEBA CEABD CEADB CEBAD CEBDA CEDAB CEDBA DABCE DABEC DACBE DACEB DAEBC DAECB DBACE DBAEC DBCAE DBCEA DBEAC DBECA DCABE DCAEB DCBAE DCBEA DCEAB DCEBA DEABC DEACB DEBAC DEBCA DECAB DECBA EABCD EABDC EACBD EACDB EADBC EADCB EBACD EBADC EBCAD EBCDA EBDAC EBDCA ECABD ECADB ECBAD ECBDA ECDAB ECDBA EDABC EDACB EDBAC EDBCA EDCAB EDCBA */