以排序(按字典顺序)的顺序在 C++ 中打印所有排列
在这个问题中,我们给定了一个长度为 n 的字符串,我们必须以排序的顺序打印该字符串字符的所有排列。
让我们举个例子来理解这个问题
输入:‘XYZ’
输出:XYZ、XZY、YXZ、YZX、ZXY、ZYX。
在这里,我们必须按照字典顺序(字母顺序升序)打印所有排列。
为了解决这个问题,我们必须先按字母顺序升序排列数组,排序后的数组是排列的第一个元素。然后生成字符串的下一个较高阶排列。
下面的代码会让你更清楚地理解解决方案
示例
#include<iostream> #include<string.h> using namespace std; int compare(const void *a, const void * b){ return ( *(char *)a - *(char *)b ); } void swap(char* a, char* b) { char t = *a; *a = *b; *b = t; } int finduBound(char str[], char first, int l, int h) { int ubound = l; for (int i = l+1; i <= h; i++) if (str[i] > first && str[i] < str[ubound]) ubound = i; return ubound; } void generatePermutaion ( char str[] ) { int size = strlen(str); qsort( str, size, sizeof( str[0] ), compare ); bool isFinished = false; while ( ! isFinished ) { cout<<str<<"\t"; int i; for ( i = size - 2; i >= 0; --i ) if (str[i] < str[i+1]) break; if ( i == -1 ) isFinished = true; else { int ubound = finduBound( str, str[i], i + 1, size - 1 ); swap( &str[i], &str[ubound] ); qsort( str + i + 1, size - i - 1, sizeof(str[0]), compare ); } } } int main() { char str[] = "NOPQ"; cout<<"Permutation in Sorted order :\n"; generatePermutaion(str); return 0; }
输出
Permutation in Sorted order : NOPQ NOQP NPOQ NPQO NQOP NQPO ONPQ ONQP OPNQ OPQN OQNP OQPN PNOQ PNQO PONQ POQN PQNO PQON QNOP QNPO QONP QOPN QPNO QPON
广告