[剑指offer]JT27---字符串的排列(醉翁之意不在酒)

题目如下

在这里插入图片描述

思路与代码

全排列

全排列的实现可以用深搜就好了,一个一个的填进去
这里直接用函数

class Solution {
    
    
public:
    vector<string> Permutation(string str) {
    
    
        sort(str.begin(),str.end());
        vector<string> ans;
        do{
    
    
            ans.push_back(str);
        }while(next_permutation(str.begin(),str.end()));
        return ans;
    }
};

手把手排列

面试官肯定还是想看点好康的!
排列可以自己写,就是不断交换嘛,简单的,看代码注释就懂了

class Solution {
    
    
public:
    vector<string> Permutation(string str) 
    {
    
    
        vector<string> result;
        if(str.empty()) return result;
        Permutation(str,result,0);        
        // 此时得到的result中排列并不是字典顺序,可以单独再排下序
        sort(result.begin(),result.end());        
        return result;
    }   
    void Permutation(string str,vector<string> &result,int begin)
    {
    
    
        if(begin == str.size()-1) // 递归结束条件:索引已经指向str最后一个元素时
        {
    
    
            if(find(result.begin(),result.end(),str) == result.end())
            {
    
    
                // 如果result中不存在str,才添加;避免aa和aa重复添加的情况
                result.push_back(str);
            }
        }
        else
        {
    
    
            // 第一次循环i与begin相等,相当于第一个位置自身交换,关键在于之后的循环,
            // 之后i != begin,则会交换两个不同位置上的字符,直到begin==str.size()-1,进行输出;
            for(int i=begin;i<str.size();++i)
            {
    
    
                swap(str[i],str[begin]);
                Permutation(str,result,begin+1);
                swap(str[i],str[begin]); // 复位,用以恢复之前字符串顺序,达到第一位依次跟其他位交换的目的
            }
        }
    } 
    void swap(char &fir,char &sec)
    {
    
    
        char temp = fir;
        fir = sec;
        sec = temp;
    }
};

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_42136832/article/details/114795332
今日推荐