剑指offer-字符串的排列

题目描述

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

输入描述:

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

解题思路

此题目要求找出一个字符串的全排列,可以按照以下两步来递归的求解:

  1. 找到当前子字符串第一个字符的所有可能,可以通过将第一个字符依次与后面与其不相同的字符交换
  2. 固定第一个字符,找到后面所有字符的全排列

从字符串的第一个字符开始,按照上述步骤递归地向后交换并寻找全排列,当遍历到最后一个字符时,此时的字符串便是一种排列顺序,于是把当前字符串加入到vector容器中。

代码

1 class Solution {
 2 public:
 3     vector<string> v;
 4     vector<string> Permutation(string str) {
 5         if(str.size())
 6             Pmt(str,0);
 7         return v;
 8     }
 9     void Pmt(string str,int f){
10         if(f==str.size()-1)
11             v.push_back(str);
12         else{
13             Pmt(str,f+1);
14             for(int i=f+1;i<str.size();i++){
15                 if(str[f]!=str[i]){
16                     swap(str[f],str[i]);
17                     Pmt(str,f+1);
18                 }
19             }
20         }
21     }
22 };

相关推荐