问题描述

输入一个字符串,打印出该字符串中字符的所有排列。
你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。
示例:
输入:s = "abc"
输出:["abc","acb","bac","bca","cab","cba"]
  限制: 1 <= s 的长度 <= 8

代码(回溯)

注意使用set为vector去重的技巧:

class Solution {
public:
vector<string> permutation(string s) {
vector<string>ans;
string path;
vector<bool> flag(s.size(),false);
backtrack(s,path,ans,flag);
set<string> st(ans.begin(), ans.end());
ans.assign(st.begin(), st.end());
return ans;
}
void backtrack(string s,string &path,vector<string>&ans,vector<bool>&flag)
{
if(path.size() == s.size())
{
ans.push_back(path);
return;
}
for(int i = 0; i < s.size(); ++i)
{
if(!flag[i])
{
path.push_back(s[i]);
flag[i] = true;
backtrack(s,path,ans,flag);
flag[i] = false;
path.pop_back();
}
} }
};

结果:

执行用时 :532 ms, 在所有 C++ 提交中击败了8.06%的用户
内存消耗 :38.6 MB, 在所有 C++ 提交中击败了100.00%的用户

代码

先排序后序不用去重

class Solution {
public:
vector<string> permutation(string s) {
vector<string>ans;
string path;
vector<bool> flag(s.size(),false);
sort(s.begin(),s.end());
backtrack(s,path,ans,flag);
return ans;
}
void backtrack(string s,string &path,vector<string>&ans,vector<bool>&flag)
{
if(path.size() == s.size())
{
ans.push_back(path);
return;
}
for(int i = 0; i < s.size(); ++i)
{
//注意最后这个!flag[i-1]
if(i > 0 && s[i] == s[i-1] && !flag[i-1])
continue;
if(!flag[i])
{
path.push_back(s[i]);
flag[i] = true;
backtrack(s,path,ans,flag);
flag[i] = false;
path.pop_back();
}
} }
};

结果:

执行用时 :116 ms, 在所有 C++ 提交中击败了59.19%的用户
内存消耗 :18 MB, 在所有 C++ 提交中击败了100.00%的用户

代码(非递归)

结果:

《剑指offer》面试题38. 字符串的排列的更多相关文章

  1. 剑指offer 面试题38 字符串的排列

    我惯用的dfs模板直接拿来套 class Solution { public: vector<string> Permutation(string str) { if(str.empty( ...

  2. C++版 - 剑指offer面试题28: 字符串的排列

    题目: 字符串的排列 热度指数:5777 时间限制:1秒 空间限制:32768K 本题知识点: 字符串 题目描述 输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出 ...

  3. 剑指Offer:面试题28——字符串的排列(java实现)(待序)

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

  4. 剑指Offer - 九度1369 - 字符串的排列

    剑指Offer - 九度1369 - 字符串的排列2014-02-05 21:12 题目描述: 输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所 ...

  5. 剑指offer(27)字符串的排列

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

  6. 剑指offer 面试题38

    面试题38:数字在排序数组中出现的次数 题目:统计一个数字在排序数组中出现的次数.例如输入排序数组{1,2,3,3,3,3,4,5}和数字3,由于3在这个数组中出现了4次,因此输出4. 主要的思路是进 ...

  7. 【剑指Offer】27、字符串的排列

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

  8. 【剑指offer 面试题38】数字在排序数组中出现的次数

    思路: 利用二分查找,分别查找待统计数字的头和尾的下标,最后做差加一即为结果. C++: #include <iostream> #include <vector> using ...

  9. C++版 - 剑指offer面试题38:数字在已排序数组中出现的次数

    数字在已排序数组中出现的次数 提交网址: http://www.nowcoder.com/practice/70610bf967994b22bb1c26f9ae901fa2?tpId=13&t ...

  10. 剑指offer二十七之字符串的排列

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

随机推荐

  1. 周期性任务(Project)

    <Project2016 企业项目管理实践>张会斌 董方好 编著 话说录入任务信息是件体力活,每个任务都是要一个字一个字码出来滴.要说一个项目文件,任务内容是主体,所以这作为体力活也不冤枉 ...

  2. 面试官:HashSet如何保证元素不重复?

    本文已收录<Java常见面试题>系列,Git 开源地址:https://gitee.com/mydb/interview HashSet 实现了 Set 接口,由哈希表(实际是 HashM ...

  3. MySQL 的日志:binlog

    前言:binlog 用于记录数据库执行写入性操作的日志信息,以二进制的形式保留在磁盘中.它是由 Server 层进行记录的,使用任何存储引擎都会产生 binlog. 实验准备 我们通过 Docker ...

  4. Java网络多线程开发:java.io.EOFException

    Java网络多线程开发:java.io.EOFException 在实现韩顺平Java的多用户即使通信系统实战项目中: 对于客户端线程的停止,老韩是向服务器端发送一个消息对象,提示服务器端进行资源释放 ...

  5. signal 信号

    python学习笔记--信号模块signal 阅读目录(Content) 1 signal基本信号名 2 常用信号处理函数 2.1 设置发送SIGALRM信号的定时器 2.2 设置信号处理函数 3 常 ...

  6. Swagger请求报错:TypeError: Failed to execute 'fetch' on 'Window': Request with GET/HEAD method cannot have body.

    TypeError: Failed to execute 'fetch' on 'Window': Request with GET/HEAD method cannot have body. 如下图 ...

  7. 注解版mybatis动态语句将空字符串转换为null

    Convert.java import java.util.Map; import java.util.Objects; /** * * @ClassName: Convert * @Descript ...

  8. summernote富文本的简单使用

    官方地址:https://summernote.org/ html代码 <div class="summernote" id="summernote" & ...

  9. 【LeetCode】1438. 绝对差不超过限制的最长连续子数组 Longest Continuous Subarray With Absolute Diff Less Than or Equal t

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 滑动窗口 日期 题目地址:https://leetco ...

  10. Challenging Common Assumptions in the Unsupervised Learning of Disentangled Representations

    目录 概 主要内容 Locatello F., Bauer S., Lucic M., R"{a}tsch G., Gelly S. Sch"{o}lkopf and Bachem ...