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