字符串的排列

字符串的排列

http://www.nowcoder.com/questionTerminal/fe6b651b66ae47d7acce78ffdd9a96c7

题目描述

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

输入描述:

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

解题思路

图片说明

class Solution {
public:
    //回溯法
    vector<string> Permutation(string str) {
        vector<string> result;
        //空字符串直接返回result
        if(str.size()==0)
            return result;

        //用一个集合进行存储,避免重复,同时默认排好序了
        set<string> res;
        Permutation(str,res,0);
        //将集合中的元素依次加入result
        for(auto &e:res)
            result.push_back(e);
        return result;
    }

    void Permutation(string str, set<string>& res, int begin)
    {
        //递归结束条件:索引已经指向str最后一个元素时
        if(begin==str.size()-1)
            res.insert(str);
        else
        {
            for(int i=begin;i<str.size();i++)
            {
                //依次进行交换
                swap(str[begin],str[i]);
                Permutation(str,res,begin+1);
                //复位
                swap(str[begin],str[i]);
            }
        }
    }

    //交换两个字符
    void swap(char& first,char& second)
    {
        char t = first;
        first = second;
        second = t;
    }
};
全部评论
复位是什么意思啊,感觉没有那句也可以啊
点赞
送花
回复
分享
发布于 2020-08-20 11:21
借助回溯法终于明白为什么for循环中:交换;递归,然后为什么又要交换了。ABCDEFG,假设AB已经确定,C此时和E做了交换,变成了ABEDCFG,然后继续全排列DCFG,搞定后还要再回来ABCDEFG,C继续和F交换再安排剩下的全排列.... 我觉得这个交换就是回溯法,牛客网把这道题划入动态规划,不是很明白。
点赞
送花
回复
分享
发布于 2020-08-20 11:58
滴滴
校招火热招聘中
官网直投

相关推荐

头像
05-14 12:29
安卓
点赞 评论 收藏
转发
3 收藏 评论
分享
牛客网
牛客企业服务