当前位置: 首页 > 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;
}
http://www.dtcms.com/a/69823.html

相关文章:

  • 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报错处理
  • 干货:Farrow设计实现详解
  • 【论文精读】DifFace: Blind Face Restoration with Diffused Error Contraction
  • Global Mapper 多功能的GIS软件
  • 【自学笔记】SQL Server基础知识点总览-持续更新
  • 【Mapbox】介绍及基本使用
  • Umi从零搭建Ant Design Pro项目(1)
  • 准确率(Precision)和召回率(Recall)
  • 【数据结构初阶第十九节】八大排序系列(下篇)—[详细动态图解+代码解析]
  • 正点原子[第三期]Arm(iMX6U)Linux移植学习笔记-5.1 uboot顶层Makefile分析-VSCode工程创建
  • 【RTSP】客户端(四) 解复用器