《剑指offer》面试题38. 字符串的排列
问题描述
输入一个字符串,打印出该字符串中字符的所有排列。
你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。
示例:
输入: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. 字符串的排列的更多相关文章
- 剑指offer 面试题38 字符串的排列
我惯用的dfs模板直接拿来套 class Solution { public: vector<string> Permutation(string str) { if(str.empty( ...
- C++版 - 剑指offer面试题28: 字符串的排列
题目: 字符串的排列 热度指数:5777 时间限制:1秒 空间限制:32768K 本题知识点: 字符串 题目描述 输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出 ...
- 剑指Offer:面试题28——字符串的排列(java实现)(待序)
问题描述: 输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba. 结果请按字母 ...
- 剑指Offer - 九度1369 - 字符串的排列
剑指Offer - 九度1369 - 字符串的排列2014-02-05 21:12 题目描述: 输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所 ...
- 剑指offer(27)字符串的排列
题目描述 输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba. 输入描述:输入 ...
- 剑指offer 面试题38
面试题38:数字在排序数组中出现的次数 题目:统计一个数字在排序数组中出现的次数.例如输入排序数组{1,2,3,3,3,3,4,5}和数字3,由于3在这个数组中出现了4次,因此输出4. 主要的思路是进 ...
- 【剑指Offer】27、字符串的排列
题目描述: 输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba. ...
- 【剑指offer 面试题38】数字在排序数组中出现的次数
思路: 利用二分查找,分别查找待统计数字的头和尾的下标,最后做差加一即为结果. C++: #include <iostream> #include <vector> using ...
- C++版 - 剑指offer面试题38:数字在已排序数组中出现的次数
数字在已排序数组中出现的次数 提交网址: http://www.nowcoder.com/practice/70610bf967994b22bb1c26f9ae901fa2?tpId=13&t ...
- 剑指offer二十七之字符串的排列
一.题目 输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba. 二.思路 我们 ...
随机推荐
- TensorFlow.NET机器学习入门【2】线性回归
回归分析用于分析输入变量和输出变量之间的一种关系,其中线性回归是最简单的一种. 设: Y=wX+b,现已知一组X(输入)和Y(输出)的值,要求出w和b的值. 举个例子:快年底了,销售部门要发年终奖了, ...
- 网站高可用架构之BASE原理
BASE理论是eBay架构师提出的. BASE定理来源:是CAP中一致性和可用性的权衡结果,它来自大规模互联网分布式系统的总结,是基于CAP定理逐步演化而来的. BASE定理的核心思想:即使无法做到强 ...
- win10修改Docker Desktop Installer的默认安装目录
Docker Desktop Installer软件默认安装会装在C:\Program Files\Docker的目录下,默认是不能修改的,但是我们可以通过设置软链接的方式把安装默认弄到其他盘 我们先 ...
- IDEA报错 Unable to open debugger port (127.0.0.1:63342): java.net.BindException "Address already in use
Unable to open debugger port (127.0.0.1:63342): java.net.BindException "Address already in use ...
- c++设计模式概述之代理
代码写的不规范,目的是缩短文章篇幅,实际中请不要这样做. 1.模式的结构 代理模式的主要角色如下: A.抽象主题(Subject)类:通过接口或抽象类声明真实主题和代理对象实现的业务方法. B.真实主 ...
- 【LeetCode】838. Push Dominoes 解题报告(Python)
[LeetCode]838. Push Dominoes 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http:// ...
- leetcode1260二维网络迁移
题目 n*m的矩阵,一个整数k,移动矩阵k次.每次移动的操作为: 向右移动(最后一列移动到第一列) 之后,第一列向下移动. 1<=N.M<=50 0<=k<=100 题解 思考 ...
- Chapter 4 Effect Modification
目录 4.1 Definition of effect modification 4.2 Stratification to identify effect modification 4.3 Why ...
- CS5216|DP1.2转HDMI1.4音视频转换芯片|CS5216参数
Capstone CS5216是一款用于DP1.2转HDMI1.4音视频转换芯片.CS5216是HDMI 电平移位器/中继器专为2型双模Display Port(DP++)电缆适配器应用而设计.它设计 ...
- CS5213demoboard设计电路|DMI转VGA带II2S音频输出转接线|CS5213方案
CS5213是台湾CAPSTONE瑞奇达推出的一款HDMI(高清多媒体接口)到VGA转换芯片. CS5213设计HDMI转VGA带II2S转接线产品特性: ◇将完整的HDMI信号转换为VGA输出◇支持 ...