在 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

更新于:2020年1月3日

613 次浏览

开启你的职业生涯

通过完成课程获得认证

开始
广告
© . All rights reserved.