部分字典序排列c+b代码及注释
时间: 2023-12-20 11:04:01 浏览: 26
以下是一个使用 C++ 实现的部分字典序排列代码,包含详细的注释:
```
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
int main() {
// 读入字符串
string s;
cin >> s;
// 计算字符串长度
int n = s.length();
// 将字符串转换为字符数组,方便排序
char c[n + 1];
strcpy(c, s.c_str());
// 排序字符数组
sort(c, c + n);
// 打印第一个排列
cout << c << endl;
// 循环生成下一个排列,直到生成的排列等于原字符串
while (true) {
// 从后往前找到第一个不满足逆序对条件的位置
int i = n - 2;
while (i >= 0 && c[i] >= c[i + 1]) {
i--;
}
// 如果找不到这样的位置,说明已经生成了所有排列,退出循环
if (i < 0) {
break;
}
// 从后往前找到第一个大于 c[i] 的位置
int j = n - 1;
while (j > i && c[j] <= c[i]) {
j--;
}
// 交换 c[i] 和 c[j]
swap(c[i], c[j]);
// 反转 c[i+1] 到 c[n-1] 的所有元素
reverse(c + i + 1, c + n);
// 打印生成的下一个排列
cout << c << endl;
}
return 0;
}
```
该代码先读入一个字符串,然后将其转换为字符数组并排序,打印第一个排列。接下来循环生成下一个排列,直到生成的排列等于原字符串。在每次生成下一个排列时,该代码从后往前找到第一个不满足逆序对条件的位置,从后往前找到第一个大于 c[i] 的位置,交换 c[i] 和 c[j],然后反转 c[i+1] 到 c[n-1] 的所有元素,最后打印生成的下一个排列。