在 C++ 中列印具有允許重複輸入的不同排序排列


在這個程式設計問題中,我們得到一個字串,我們必須列印可以形成的字串元素的不同排序排列。這個問題的條件是字串可能包含出現不止一次的字元。此外,給定的字串按排序順序輸入。

讓我們舉個例子來更好地理解這個概念:

Input : ABD
Output : ABD , ADB , BAD , BDA , DAB , DBA
INPUT : RSTU
OUTPUT : RSTU , RSUT , RTSU , RTUS , RUST , RUTS , SRTU , SRUT , STRU , STUR , SURT , SUTR , TRSU , TRUS , TSRU , TSUR , TURS , TUSR , URST , URTS , USRT , USTR , UTRS , UTSR.

排列是根據特定序列或型別重新排列集合的所有元素。集合可能是已排序的,也可能未排序。

現在我們已經瞭解了關於這個問題的一切。讓我們嘗試建立一個邏輯來解決這個問題:

我們知道一些與排列相關的數學公式。由包含 n 個字元且所有字元都不同的字串生成的字串總數由 n! 給出。如果字串中存在重複的字元,則字串的數量由 n! / i!給出。

對於字串 STURS,可以生成的字串總數為 5! / 2! = 60。因為 s 在字串中出現 2 次。

利用這個公式,我們知道生成的字串數量。現在,我們必須建立這些字串。為此,首先我們將對字串進行排序(如果不是按排序順序輸入的),以便最終字串按排序形式排列。現在,固定字串的第一個字元,並找到其餘所有字元的排列,依此類推。這將以排序的方式給出所有所需的排列。

例如:

輸入 − RST

邏輯

從這個字串中,可以形成總共 3! = 6 個排列。

讓我們固定 R 並找到 s 和 t 的排列。這將給出 2 個字串 RST、RTS。

同樣,固定 S 將給出 SRT、STR。固定 T 將給出 TRS、TSR。

因此,這將給出輸出為 - RST、RTS、SRT、STR、TRS、TSR。這些都是按排序順序排列的。

現在,讓我們建立一個程式來解決這個問題:

示例

#include <bits/stdc++.h>
using namespace std;
bool swaper(char str[], int start, int curr){
   for (int i = start; i < curr; i++)
      if (str[i] == str[curr])
      return 0;
   return 1;
}
void printPermutations(char str[], int index, int n){
   if (index >= n) {
      cout<<str<<"\t";
      return;
   }
   for (int i = index; i < n; i++) {
      bool check = swaper(str, index, i);
      if (check) {
         swap(str[index], str[i]);
         printPermutations(str, index + 1, n);
         swap(str[index], str[i]);
      }
   }
}
int main(){
   char str[] = "AABC";
   int n = strlen(str);
   cout<<"The string is : "<<str<<end;
   cout<<"The distinct sorted permutations are : \t";
   printPermutations(str, 0, n);
   return 0;
}

輸出

The string is : AABC
The distinct sorted permutations are : AABC AACB
   ABAC ABCA ACBA ACAB BAAC
   BACA BCAA CABA CAAB CBAA

更新於:2020年1月3日

613 次瀏覽

開啟你的職業生涯

透過完成課程獲得認證

開始
廣告
© . All rights reserved.