打印不同的排序排列,并在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