leetcode46. Permutations 、47. Permutations II、 剑指offer字符串的排列
字符串排列和PermutationsII差不多
Permutations第一种解法:
这种方法从0开始遍历,通过visited来存储是否被访问到,level代表每次已经存储了多少个数字
时间复杂度O(n!)
class Solution {
public:
vector<vector<int>> permute(vector<int>& nums) {
vector<vector<int> > result;
if(nums.empty())
return result;
vector<int> res;
vector<bool> visited(nums.size(),);
int level = ;
permute(nums,result,res,visited,level);
return result;
}
void permute(vector<int>& nums,vector<vector<int> >& result,vector<int>& res,vector<bool>& visited,int level){
if(level == nums.size()){
result.push_back(res);
return;
}
for(int i = ;i < nums.size();i++){
if(visited[i] == )
continue;
res.push_back(nums[i]);
visited[i] = ;
permute(nums,result,res,visited,level+);
res.pop_back();
visited[i] = ;
}
}
};
第二种解法:
class Solution {
public:
vector<vector<int>> permute(vector<int>& nums) {
permute(nums,);
return res;
}
void permute(vector<int>& nums,int begin){
if(begin == nums.size() - )
res.push_back(nums);
for(int i = begin;i < nums.size();i++){
swap(nums[i],nums[begin]);
permute(nums,begin+);
swap(nums[i],nums[begin]);
}
}
vector<vector<int>> res;
};
Permutations II
class Solution {
public:
vector<vector<int>> permuteUnique(vector<int>& nums) {
vector<vector<int> > result;
if(nums.empty())
return result;
vector<int> res;
vector<bool> visited(nums.size(),);
int level = ;
sort(nums.begin(),nums.end());
permute(nums,result,res,visited,level);
return result;
}
void permute(vector<int>& nums,vector<vector<int> >& result,vector<int>& res,vector<bool>& visited,int level){
if(level == nums.size()){
result.push_back(res);
return;
}
for(int i = ;i < nums.size();i++){
if(visited[i] == )
continue;
if(i > && nums[i] == nums[i-] && visited[i-] == )
continue;
visited[i] = ;
res.push_back(nums[i]);
permute(nums,result,res,visited,level+);
res.pop_back();
visited[i] = ;
}
}
};
把第二个剪枝写在for循环一开始这种方式,实际上每次只存储重复数字中的第二个,相当于按照逆序的方式存储相同的数字

leetcode46. Permutations 、47. Permutations II、 剑指offer字符串的排列的更多相关文章
- 剑指Offer——字符串的排列
题目描述: 输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba. 输入描述: ...
- 用js刷剑指offer(字符串的排列)
题目描述 题目描述 输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba. 输入 ...
- 【LeetCode】137. 只出现一次的数字 II(剑指offer 56-II)
137. 只出现一次的数字 II(剑指offer 56-II) 知识点:哈希表:位运算 题目描述 给你一个整数数组 nums ,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次 .请你找出并返回 ...
- 剑指offer28 字符串的排列
1.全局变量可以在最后去定义并初始化,不一定非要在开头 2.此题有一种特殊情况需要考虑,比如字符串是“aa”,那输出应该是“aa”,而不是“aa,aa”,即相同的不输出.实现这个处理用了c++中的容器 ...
- 154. Find Minimum in Rotated Sorted Array II(剑指offer)
Follow up for "Find Minimum in Rotated Sorted Array":What if duplicates are allowed? Would ...
- 剑指offer字符串列表
字符串 面试题5:替换空格 面试题20:表示数值的字符串 面试题58:翻转字符串 面试题58(二):左旋转字符串
- 剑指offer字符串1
面试题5:替换空格 请实现一个函数,将一个字符串中的每个空格替换成“%20”.例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy. class Solu ...
- 剑指Offer——字符串的排序
Question 输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba. 输入描 ...
- 剑指offer--9.字符串的排列
next_permutation(),还是那个feel ------------------------------------------------------------------------ ...
随机推荐
- angularjs小练习(分别通过ng-repeat和ng-option动态生成select下拉框)
本次做一个简单的关于动态生成select的练习 在实现上有两种方式: 其一.通过ng-repeat来实现 其二.通过ng-option来实现 在页面效果上,两种实现的效果都一样 但是在数据选择的数据从 ...
- Redis基础认识及常用命令使用(一)--转载
Redis简介 redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合)和zset(有序集 ...
- Java学习笔记之——冒泡排序
冒泡排序:解决数组的排序问题,比如从大到小或者从小到大 原理:两两比较 案例:
- Java学习笔记之——常用转义符号
\ 单独用会报错 \\ 打印右斜杠 \n 换行 \t Tab键 \" 双引号 \' 单引号
- Java面试总结(集合、spring)
Java 集合框架简介 Java Collections Framework,最开始也是一个开源框架,后来被收录到JDK中 所谓的集合,就是能存放多个数据元素的容器,在Java中原生的容器是数组 数组 ...
- Mybatis关联查询之一对多和多对一XML配置详解
平时在开发过程中dao.bean和XML文件都是自动生成的,很少写XML的配置关系,今天记录一下mybatis的关联查询中的多对一和一对多的情况. 首先是有两张表(学生表Student和老师Teach ...
- OSX系统下配置Apache+PHP+MySQL+Navicat
概述 OSX系统对于PHP运行非常友好,我们只需要进行简单的配置便可以开始进行使用,本篇文章将一步一步地介绍Apache.PHP和MySQL的安装与配置,为开始进行开发铺好路 Apache 启动Apa ...
- csharp:SMO run sql script
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- php soapclient 超时 设置
用php的soapclient,默认是60秒.可在php.ini里配置, 重启APache 或者在PHP代码里做设置 ini_set('default_socket_timeout', 300);// ...
- python之初始面向对象
1. 初识面向对象 面向过程: 一切以事务的发展流程为中心. 面向对象: 一切以对象为中心. 一切皆为对象. 具体的某一个事务就是对象 2. 类. 对象 类: 就是图纸. 创建对象的第一步. 先画图 ...