1つのタイトル説明
文字列の入力は、辞書式順序で文字列の文字のすべての順列を出力します。例えば、入力文字列abcの場合は、ABCのすべての文字列、B、Cが出て配置することができ、ACB、BAC、BCA、CABおよびCBAを印刷します。
説明を入力します。
9(おそらく繰り返し文字)以下での文字列を入力し、文字は小文字のみが含まれます。2つのアイデアや方法
最初の文字固定、再帰後ろ最初の文字列の様々な組合せを得、次いで、最初の文字が各交換後の文字は、再帰的に取得されるのと同じ文字列がそれらの組合せ;各再帰は、最後のビット時間であり、再帰サイクル、第2文字列を順次サブそれぞれの最初の文字に切り替え、その後、ストリングの処理を継続します。
3 C ++コアコード
1 クラスソリューション{ 2 公共: 3 ベクトル< ストリング > 結果。 4 ベクトル< ストリング >順列(文字列strの){ 5 であれば(str.length()== 0 ) 6 リターン結果。 7 permutation1(STR、0 ); 8 ソート(result.begin()、result.end())。 9 リターン結果; 10 } 11 空隙 permutation1(文字列 strの、int型開始){ 12 であれば(==始めるstr.length()) 13 { 14 result.push_back(STR)を、 15 リターン; 16 } 17 のために(int型 I =始める;!STRを[I] = ' \ 0 ' ; iは++ ) 18 { 19 場合(!I =始める&& STR [開始] == STR [i])と 20 続けます。 21 スワップ(STR [開始]、STR [I])。 22 permutation1(STR、+始まる1 )。 23 スワップ(STR [開始]、STR [I])。 24 } 25 } 26 }。
4 C ++完全なコード
1の#include <stdio.hの> 2の#include <ベクトル> 3の#include <iostreamの> 4の#include < ストリング > 5 6 使用して 名前空間STD。 7 8 ボイドスワップ(チャー&、チャー&B){ 9 チャー TEMP = 。 10 = B。 11 B = TEMP。 12 } 13 空隙 permcore(文字列リスト、INT低い、INT高い、ベクトル< ストリング>&RES){ 14 IF(低高&& == 15 検索(res.begin()、res.end()、リスト)res.end ==()){ // 重複除外 16 res.push_back(一覧) ; 17 } 18である 他{ 19 のためには、(int型 I =がLow;私は=高<; Iは++){ // 第一スイッチング素子の各素子 20は IF(I ==低||リスト[I] =リスト[!低]){ // デエンファシス 21は スワップ(リスト[I]、リスト[低]); 22である permcore(一覧、低+ 。1、高、RES); // 交換後、パーマとサブ機能を付与するサブシーケンスを得ることフル順列シーケンス 23 スワップ(リスト[I]、リスト[低]); // 最後に、スイッチング素子バック、復元、および他のスイッチング素子 24 } 25 } 26れる } 27 } 28 29ベクター< ストリング >パーマ(文字列STR) 30 { 31は ベクトル< ストリング > RES。 32 IF(!str.empty()) 33である permcore(STR、0、str.size() - 1 、RES) 34が 復帰RES; 35 } 36 37 [ INT メイン() 38 { 39 ベクター< ストリング > RES。 40 文字列 stdstr = " ABB " 。 41の RES = パーマ(stdstr)。 42 のための(自動S:RES) 43 COUT << S << ENDL。 44 COUT << ENDL。 45 46 列 stdstr2 = " AAB " 。 47の RES = パーマ(stdstr2)。 48 用(オートS:RES) 49 coutの<< S << てendl; 50 coutの<< てendl; 51 52 システム(" 一時停止" )。 53 リターン 0 ; 54 }
参考資料
https://blog.csdn.net/JarvisKao/article/details/76999473