在 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