字符串排列和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字符串的排列的更多相关文章

  1. 剑指Offer——字符串的排列

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

  2. 用js刷剑指offer(字符串的排列)

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

  3. 【LeetCode】137. 只出现一次的数字 II(剑指offer 56-II)

    137. 只出现一次的数字 II(剑指offer 56-II) 知识点:哈希表:位运算 题目描述 给你一个整数数组 nums ,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次 .请你找出并返回 ...

  4. 剑指offer28 字符串的排列

    1.全局变量可以在最后去定义并初始化,不一定非要在开头 2.此题有一种特殊情况需要考虑,比如字符串是“aa”,那输出应该是“aa”,而不是“aa,aa”,即相同的不输出.实现这个处理用了c++中的容器 ...

  5. 154. Find Minimum in Rotated Sorted Array II(剑指offer)

    Follow up for "Find Minimum in Rotated Sorted Array":What if duplicates are allowed? Would ...

  6. 剑指offer字符串列表

    字符串 面试题5:替换空格 面试题20:表示数值的字符串 面试题58:翻转字符串 面试题58(二):左旋转字符串

  7. 剑指offer字符串1

    面试题5:替换空格 请实现一个函数,将一个字符串中的每个空格替换成“%20”.例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy. class Solu ...

  8. 剑指Offer——字符串的排序

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

  9. 剑指offer--9.字符串的排列

    next_permutation(),还是那个feel ------------------------------------------------------------------------ ...

随机推荐

  1. WebForm 【发送邮件】

    C#实现简单的SmtpClient发送邮件 分析 需要什么 发送邮件     --       发送内容         --      接收邮件 流程(各功能都适用) 创建对象    --     ...

  2. laravel使用JSON 类型方式进行存储

    Laravel 从 5.0 版本开始就已支持 JSON 数据的转换,但这样做的目的只是为了方便数据处理.你的数据依然以 TEXT 类型存放在你的数据库里.不过 MySQL 从 5.7 版本起开始支持原 ...

  3. 精选20道Java代码笔试题

    1.运算符优先级问题,下面代码的结果是多少? public class Test { public static void main(String[] args) { int k = 0; int r ...

  4. Bootstrap 、AngularJs

    SPA 全称:single-page application单页面应用 说明:类似原生客户端软件更流畅的用户体验的页面.所有的资源都是按需加载到页面上. JSR 全称:Java Specificati ...

  5. spring boot 随手记

    1.当加入security 起步依赖后,如果不做任何手动配置的话,默认会跳转到一个登录页面,不管你喜不喜欢,所有的请求都必须登录,用户名和密码是保存在内存中的, 默认用户名是user  密码在控制台里 ...

  6. pycharm技巧

    常用快捷键 1.Ctrl + Enter:在下方新建行但不移动光标: 2.Shift + Enter:在下方新建行并移到新行行首: 3.Ctrl + /:注释(取消注释)选择的行: 4.Ctrl + ...

  7. AIMLBot (中文自动回复)文本自动回复机器人

    https://github.com/chivandikwa/AIMLBot (csharp) https://github.com/gunthercox/ChatterBot (python) ht ...

  8. .Net Core(完) 创建Docker镜像

    使用Docker可以在操作系统上分出多个独立的区域(容器/Container),各个容器之间基本隔离,且可以有自己单独的系统配置.软件等,各个容器之间的软件基本不会互相干扰.Docker上配置好的容器 ...

  9. Kotlin入门(9)函数的基本用法

    上一篇文章介绍了Kotlin新增的空安全机制,控制语句部分可算是讲完了,接下来将连续描述Kotlin如何定义和调用函数,本篇文章先介绍函数的基本用法. 前面几篇文章介绍控制语句之时,在setOnCli ...

  10. 9.4、__del__、__doc__、__dict__、__module__、__getitem__、__setitem__、__delitem__、__str__、__repr__、__call__

    相关内容: __del__.__doc__.__dict__.__module__.__getitem__.__setitem__.__delitem__.__str__.__repr__.__cal ...