(C++)剑指offer-27:字符串的排列(分解让复杂问题简单)(没太懂)

本文介绍了一种求解字符串全排列的算法实现,通过递归方式完成字符串中字符的所有可能排列,并确保输出结果按照字典序排列。适用于字符串长度不超过9且包含大小写字母的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

剑指offer-27:字符串的排列

目录

1题目描述

输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。

输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。
这里写图片描述

2题目答案

解题思路:本题求整个字符串的全排列可以看做两步

1)首先求出所有可能出现在第一位置的字母,即begin与后面所有与它不同的字母进行交换

2)固定第一个字母,求后面字母的全排列,即递归此时begin = begin+1

class Solution {
public:
    vector<string> Permutation(string str) {
        vector<string> a;
        if(str.empty()) return a;

        Permutation(a,str,0);
       // sort(a.begin(),a.end());//按照字典序输出
        return a;
     }
     void Permutation(vector<string> &array, string str, int begin)//遍历第begin位的所有可能性
     {
        //一次遍历的结束条件
        if(begin == str.size()-1)
            array.push_back(str);

        for(int i=begin;i<str.size();i++)
        {
            if(i!=begin && str[i] == str[begin])
                continue;//有与begin位重复的字符串不进行交换,跳过

            swap(str[i],str[begin]);
            //当i==begin时,也要遍历其后面的所有字符
            //当i!=begin时,先交换,使第begin位取到不同的可能字符,再遍历后面的字符

            Permutation(array,str,begin+1);

            swap(str[i],str[begin]);//为了防止重复的情况,还需要将begin处的元素重新换回来
        }
     }
};

3完整代码

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
class Solution {
public:
    vector<string> Permutation(string str) {
        vector<string> a;
        if(str.empty())
            return a;
        Permutation(a,str,0);
        sort(a.begin(),a.end());//按照字典序输出
        return a;
     }
     void Permutation(vector<string> &array, string str, int begin)//遍历第begin位的所有可能性
     {
        //一次遍历的结束条件
        if(begin == str.size()-1)
        {
            array.push_back(str);
        }
        for(int i=begin;i<str.size();i++)
        {
            if(i!=begin && str[i] == str[begin])
            {
                continue;//有与begin位重复的字符串不进行交换,跳过
            }
            swap(str[i],str[begin]);
            //当i==begin时,也要遍历其后面的所有字符
            //当i!=begin时,先交换,使第begin位取到不同的可能字符,再遍历后面的字符
            Permutation(array,str,begin+1);
            swap(str[i],str[begin]);//为了防止重复的情况,还需要将begin处的元素重新换回来
        }
     }
};
int main()
{
    string a = "abb";
    Solution s;
    vector<string> b;
    b = s.Permutation(a);
    for(int i=0;i<b.size();i++)
    {
        cout<<i<<endl;
        cout<<b[i]<<endl;
    }
    return 0;
}

0
abb
1
bab
2
bab
3
bba
4
bba

  • 输入abc
    0
    abc
    1
    acb
    2
    bac
    3
    bca
    4
    cab
    5
    cba
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值