字符的全排列

题目描述

给定一个 没有重复 数字的序列,返回其所有可能的全排列。

输入描述:

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

思路:DFS

代码:

class Solution {
public:
void allpermute(vector<int>&nums,vector<int>temp,vector<vector<int>> &results)
{if(temp.size()==nums.size()){results.push_back(temp);}for(int i=0;i<nums.size();i++){auto iter=find(temp.begin(),temp.end(),nums[i]);if(iter!=temp.end()){continue;}temp.push_back(nums[i]);allpermute(nums,temp,results);temp.pop_back();}return;
}
vector<vector<int>> permute(vector<int>& nums) {vector<vector<int>>  results ; int len = nums.size();vector<int>temp;allpermute(nums,temp,results);return results;
}
};

字符的组合

题目:输入一个字符串,输出该字符串中字符的所有组合。举个例子,如果输入abc,它的组合有a、b、c、ab、ac、bc、abc。

上面我们详细讨论了如何用递归的思路求字符串的排列。同样,本题也可以用递归的思路来求字符串的组合。

思路:同样是用递归求解。可以考虑求长度为n的字符串中m个字符的组合,设为C(n,m)。原问题的解即为C(n, 1), C(n, 2),...C(n, n)的总和。对于求C(n, m),从第一个字符开始扫描,每个字符有两种情况,要么被选中,要么不被选中,如果被选中,递归求解C(n-1, m-1)。如果未被选中,递归求解C(n-1, m)。不管哪种方式,n的值都会减少,递归的终止条件n=0或m=0。

//函数功能 : 从一个字符串中选m个元素
//函数参数 : pStr为字符串, m为选的元素个数, result为选中的
//返回值 :   无
void Combination_m(char *pStr, int m, vector<char> &result)
{  if(pStr == NULL || (*pStr == '\0'&& m != 0))  return;  if(m == 0) //递归终止条件  {  for(unsigned i = 0; i < result.size(); i++)  cout<<result[i];  cout<<endl;  return;  }  //选择这个元素  result.push_back(*pStr);  Combination_m(pStr + 1, m - 1, result);  result.pop_back();  //不选择这个元素  Combination_m(pStr + 1, m, result);
}
//函数功能 : 求一个字符串的组合
//函数参数 : pStr为字符串
//返回值 :   无
void Combination(char *pStr)
{  if(pStr == NULL || *pStr == '\0')  return;  int number = strlen(pStr);  for(int i = 1; i <= number; i++)  {  vector<char> result;  Combination_m(pStr, i, result);  }
}  

字符的子集

描述

给定一个含不同整数的集合,返回其所有的子集

子集中的元素排列必须是非降序的,解集必须不包含重复的子集

您在真实的面试中是否遇到过这个题?  是

样例

如果 S = [1,2,3],有如下的解:

 
  1. [

  2. [3],

  3. [1],

  4. [2],

  5. [1,2,3],

  6. [1,3],

  7. [2,3],

  8. [1,2],

  9. []

  10. ]

挑战

你可以同时用递归与非递归的方式解决么?

递归的方法:
不要去想递归是如何一层一层调用的,而是要想如果解决当前问题,找到递归的出口

和字符串的排列一样,将数组分为第一个元素和后面的所有的元素,此时面临取第一个元素,递归剩余的元素或者不取第一个元素(即直接递归剩余元素)

代码如下:

class Solution {
public:/*** @param nums: A set of numbers* @return: A list of lists*/vector<vector<int>> subsets(vector<int> &nums) {// write your code here//这里排序并不必须,只是为了子集中元素以递增排序sort(nums.begin(), nums.end());vector<vector<int>> subs;vector<int> sub;  genSubsets(nums, 0, sub, subs);return subs; }void genSubsets(vector<int>& nums, int start, vector<int>& sub, vector<vector<int>>& subs) {//我们发现这里好像并没有递归出口,因为终止条件由下面for循环控制subs.push_back(sub);        for (int i = start; i < nums.size(); i++) {//情况一:子集包含元素nums[i]sub.push_back(nums[i]);//为何是i+1,因为已经解决了第i个元素,需要递归从第i+1个元素开始求解genSubsets(nums, i + 1, sub, subs);//情况二:子集不包含nums[i],即略过第i个元素//可以想象,不去管上一条递归语句,当下一次循环到i+1时,第i个元素已经略过sub.pop_back();}}
};

题目:输入两个整数n和m,从数列1,2,3...n中随意取几个数,使其和等于m,要求列出所有的组合。

#include <iostream>
#include <list>
using namespace std;
list<int> list1;
void find_factor(int sum,int n)
{  //递归出口  if(n<=0||sum<=0)  return;  //输出找到的数  if(sum==n)  {  list1.reverse();  for(list<int>::iterator iter=list1.begin();iter!=list1.end();iter++)  cout<<*iter<<"+";  cout<<n<<endl;  list1.reverse();  }  list1.push_front(n);  find_factor(sum-n,n-1);//n放在里面  list1.pop_front();  find_factor(sum,n-1);//n不放在里面
}  int main(void)
{  int sum,n;  cin>>sum>>n;  cout<<"所有可能的序列,如下:"<<endl;  find_factor(sum,n);  return 0;
}  

46 全排列(递归)相关推荐

  1. 46. 全排列 47. 全排列 II

    46. 全排列 给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 .你可以 按任意顺序 返回答案. 示例 1: 输入:nums = [1,2,3] 输出:[[1,2,3],[1,3,2 ...

  2. 数据结构之栈与递归的应用(全排列递归解法)

    上一节讲了一下汉诺塔的递归实现,这一节说一下全排列递归解法. 参考了Casionx的博客,给博主带来的不便请原谅.全排列算法思路解析  全排列递归解法 全排列的定义和公式:从n个数中选取m(m< ...

  3. 全排列【46. 全排列】

    一,题目描述 力扣 46. 全排列 难度中等1767 给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 .你可以 按任意顺序 返回答案. 示例 1: 输入:nums = [1,2,3] ...

  4. Suzy加油吧 Day 29 | 回溯算法进行中:491. 递增子序列,46 全排列,47 全排列2

    491. 递增子序列(新 & 难) 呜呜呜呜呜 题目 给你一个整数数组 nums ,找出并返回所有该数组中不同的递增子序列,递增子序列中 至少有两个元素 .你可以按 任意顺序 返回答案. 数组 ...

  5. 每日一道leetcode(python)46. 全排列

    每日一道leetcode(python)46. 全排列 2021-08-25 给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 .你可以 按任意顺序 返回答案.示例 1:输入:nums ...

  6. leetcode 45. 跳跃游戏 II 46. 全排列

    leetcode 45. 跳跃游戏 II 46. 全排列 45. 跳跃游戏 II 难度中等1273收藏分享切换为英文接收动态反馈 给你一个非负整数数组 nums ,你最初位于数组的第一个位置. 数组中 ...

  7. leetcode —— 46. 全排列(递归+回溯)

    给定一个 没有重复 数字的序列,返回其所有可能的全排列. 示例: 输入: [1,2,3] 输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2 ...

  8. 全排列递归实现的讨论

     给出1, 2, 3, 4四个数, 请编程输出其全排列, 如: 1 2 3 4 1 2 4 3 1 3 2 4 1 3 4 2 ... 这样的题, 我们在学校的时候一般都遇到过,而我们最先能想到的,应 ...

  9. 【LeetCode】0046.全排列 (递归详解)

    题目要求 要求在给定的一个 没有重复 数字的序列,返回其所有可能的全排列. 图解示例 算法思想 使用递归的方法 设计全局变量(也就是返回值),设计存储分步结果的列表,设计一个数组,用来判断该数是否已经 ...

最新文章

  1. 编译是检查C语言什么的错误,c语言编译过程
  2. 吴恩达机器学习笔记61-应用实例:图片文字识别(Application Example: Photo OCR)【完结】...
  3. document.forms用法示例介绍
  4. 制作可以自动隐藏的弹出式菜单
  5. 给大家推荐认识一位中科院大佬!
  6. minGW64安装和使用 极简教程
  7. CH 5102Mobile Service题解
  8. Zabbix3.0安装文档
  9. 《互联网+ 电商平台设计与运营》一一2.4 小结
  10. 全屏幕文本编辑器___Q10的设置:
  11. Asp.net系列--基础篇(二)
  12. Java中常见常用的类
  13. 帝国cms如何安装php模板,帝国CMS整站源码通用安装教程
  14. 最大公约数c语言,C语言求最大公约数代码及解析
  15. AD中生成交互式BOM,方便手工焊接及贴片
  16. 原来网易的lofter界面是模仿的是tumblr
  17. 微信域名防封PHP程序强制跳转到浏览器打开
  18. vue项目权限:数据权限、菜单权限、按钮权限
  19. 路程c语言,一道关于路程的程序。我一直看不懂,请教大家帮着看看和解释一下,谢谢。我很急急着...
  20. 实战:开发Python项目管理平台Sailboat

热门文章

  1. Infor协助联业制衣促进业务增长和提升灵活性
  2. C# 实现类似QQ的窗体在桌面边缘停靠和隐藏
  3. 苹果认证Apple Store Connenct api的使用
  4. 外贸邮件营销用什么免费邮件群发平台好?
  5. 我的世界怎么修改服务器刷怪率,我的世界刷怪率提高办法讲解
  6. 虚拟机中用Docker安装并启动了Elasticsearch,浏览器却访问不了
  7. php 微信小程序虚拟支付,为什么有些小程序可以做虚拟支付
  8. 支付宝开放平台api接口封装统一调用方式
  9. hive解绑邮箱_【情报】解除帐号绑定的方法 @魔灵召唤 哈啦板 账号解绑攻略
  10. 掷骰子游戏(简略版)