27.字符串的排列

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

题目抽象:给定一个字符串,求该字符串的全排列

方法:递归法
递归三部曲:1.递归函数的功能:dfs(int pos, string s), 表示固定字符串s的pos下标的字符s[pos]
2.递归终止条件:当pos+1 == s.length()的时候,终止,表示对最后一个字符进行固定,也就说明,完成了一次全排列
3.下一次递归:dfs(pos+1, s), 很显然,下一次递归就是对字符串的下一个下标进行固定

但是对于ABB这种的来说,会有重复,所以,我们可以用set进行去重,代码如下:

class Solution {
public:    
    void perm(int pos, string s, set<string> &ret) {       
        if (pos+1 == s.length()) {          
          ret.insert(s);           
           return;       
          }        // for循环和swap的含义:对于“ABC”,       
           // 第一次'A' 与 'A'交换,字符串为"ABC", pos为0, 相当于固定'A'     
              // 第二次'A' 与 'B'交换,字符串为"BAC", pos为0, 相当于固定'B'        
              // 第三次'A' 与 'C'交换,字符串为"CBA", pos为0, 相当于固定'C'       
               for (int i = pos; i < s.length(); ++i) {           
                swap(s[pos], s[i]);           
                 perm(pos+1, s, ret);            
                 swap(s[pos], s[i]);           
                  // 回溯的原因:比如第二次交换后是"BAC",需要回溯到"ABC"            
                  // 然后进行第三次交换,才能得到"CBA"      
                 }    
              }    
                    vector<string> permutation(string s) {        
                     if (s.empty()) return {};       
                      set<string> ret;       
                       perm(0, s, ret);        
                       return vector<string>({ret.begin(), ret.end()});    
                       }
           };
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值