打印不同的排序排列,并在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.
PERMUTATION正在根据特定序列或类型重新排列集合的所有元素。该套装可以订购,也可以不订购。
现在,我们已经了解了有关该问题的一切。让我们尝试创建解决问题的逻辑,
我们知道一些与置换有关的数学公式。由n个字符组成的包含n个字符的字符串生成的字符串总数由n!给出。如果字符串中有重复的字符,则字符串数由n给出!/一世!。
对于字符串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