当前位置: 首页 > news >正文

【PTA题目解答】7-3 字符串的全排列(20分)next_permutation

1.题目

给定一个全由小写字母构成的字符串,求它的全排列,按照字典序从小到大输出。

输入格式:

一行,一个字符串,长度不大于8。

输出格式:

输出所有全排列,每行一种排列形式,字典序从小到大。

输入样例:

在这里给出一组输入。例如:

abc

输出样例:

在这里给出相应的输出。例如:

abc
acb
bac
bca
cab
cba

2.算法原理

排序字符串: 使用 sort(s.begin(), s.end()) 将字符串按字典序排序。 这是必要的,因为next_permutation 需要从最小的排列开始生成。

生成全排列: 使用 do-while 循环和 next_permutation 生成所有排列。next_permutation(s.begin(), s.end()) 会修改字符串 s,生成下一个字典序排列。 当没有下一个排列时,函数返回 false,循环结束。

代码:

#include <iostream>
#include <algorithm> // 包含 next_permutation 和 sort
#include <string>

int main() {
    std::string s;
    std::cin >> s; // 输入字符串

    // 将字符串按字典序排序
    std::sort(s.begin(), s.end());

    // 输出所有排列
    do {
        std::cout << s << std::endl;
    } while (next_permutation(s.begin(), s.end()));

    return 0;
}

扩展:模拟 nextPermutation 函数

#include <iostream>
#include <string>
#include <vector>
#include <algorithm> // 用于 std::reverse

using namespace std;

bool nextPermutation(string& s) {
    int n = s.length();
    int i = n - 2;

    // 从后向前查找第一个 s[i] < s[i+1] 的位置
    while (i >= 0 && s[i] >= s[i + 1]) {
        i--;
    }

    // 如果找不到,说明已经是最大排列
    if (i < 0) {
        return false;
    }

    // 从后向前查找第一个 s[j] > s[i] 的位置
    int j = n - 1;
    while (j >= 0 && s[j] <= s[i]) {
        j--;
    }

    // 交换 s[i] 和 s[j]
    std::swap(s[i], s[j]);

    // 反转 i+1 到末尾的部分
    std::reverse(s.begin() + i + 1, s.end());

    return true;
}


int main() {
    string s;
    cin >> s; // 输入字符串

    // 将字符串按字典序排序
    sort(s.begin(), s.end());

    // 输出所有排列
    do {
        std::cout << s << std::endl;
    } while (nextPermutation(s));

    return 0;
}

相关文章:

  • Redis 的特点
  • 大模型推理后JSON数据后处理
  • Elasticsearch集群与日志系统实战部署指南
  • 3 C#调用visionPro的toolblock的步骤
  • jQuery从入门到应用:选择器、DOM与Ajax综合指南
  • AGI大模型(7):提示词应用
  • 怎样通过企业数据资产管理推动企业数字化转型
  • Linux 系统蓝牙音频服务实现分析
  • Qt:槽函数与信号
  • 【QT笔记---QText】
  • APL语言的嵌入式存储
  • 用人工智能程序驱动机器人工作
  • Java基础-List、Set、Map
  • PyQt6嵌入HTML5内容教程
  • 小聪转转转
  • LinkedList底层结构和源码分析(JDK1.8)
  • OpenFeign的配置类可以进行哪些配置
  • Could not find resource...
  • synchronized与 Java内置锁(未写完)
  • PyCharm 2019.1.3使用python3.9创建虚拟环境setuptools-40.8.0报错处理
  • 《大风杀》上海首映,白客说拍这戏是从影以来的最大挑战
  • 王毅谈金砖国家开展斡旋调解的经验和独特优势
  • 乌美签署矿产协议
  • 国家网信办举办在欧中资企业座谈会,就数据跨境流动等进行交流
  • 韩国检方结束对尹锡悦私宅的扣押搜查
  • 启程回家!神十九轨道舱与返回舱成功分离