字符串的排列组合问题

一:N个字符的全排列

深度搜索实现


//比较简单的代码,这个题目算经典的
class Solution {
public :
     vector<string> Permutation(string str) {       
         if (str!= "" ) dfs(str, 0);
         return ret;
     }
private :
     vector<string> ret;
     void dfs(string str, int s){
         int sz = str.size();
         if (s==sz){
             ret.push_back(str);
             return ;
         }
         for ( int i = s; i < sz; ++i){
             if (i!=s && str[s]==str[i]) continue ;
             swap(str[s], str[i]);
             dfs(str, s+1);
         }
     }  
};

二:无重复元素的子集


回溯法的经典求解过程

#include<stdio.h>
#include <vector>
//using namespace std;
class Solution{
    public:
        std::vector<std::vector<int> > Subset(std::vector<int> &nums) {
        std::vector<std::vector<int> > result;
        std::vector<int> item;
        result.push_back(item);
        generate(0,nums,item,result);
        return result;
      }
    private:
        void generate(int i,std::vector<int>&nums,std::vector<int> &item,
        std::vector<std::vector<int> >&result)
        {
            if(i>=nums.size())
            {return;}
            item.push_back(nums[i]);
            result.push_back(item);
            generate(i+1,nums,item,result);
            item.pop_back();
            generate(i+1,nums,item,result);
            
        }
};

int main()
{
  std::vector<int> nums;
  nums.push_back(1);
  nums.push_back(2);
  nums.push_back(3);
  Solution A;
  std::vector<std::vector<int> > result;
  result = A.Subset(nums);
  for(int i=0;i<result.size();i++)
  {
      for(int j=0;j<result[i].size();j++)
      {printf("[%d]",result[i][j]);}
       printf("\n");
    
  }
   
    return 0;
}


三:求有重复元素






猜你喜欢

转载自blog.csdn.net/runner668/article/details/80040235