在 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
廣告
資料結構
網路
關係資料庫管理系統 (RDBMS)
作業系統
Java
iOS
HTML
CSS
Android
Python
C 程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP