剑指offer27:按字典序打印出该字符串中字符的所有排列
1 题目描述
输入描述:
输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。
2 思路和方法
固定第一个字符,递归取得首位后面的各种字符串组合;再将第一个字符与后面每一个字符交换,同样递归获得其字符串组合;每次递归都是到最后一位时结束,递归的循环过程,就是从每个子串的第二个字符开始依次与第一个字符交换,然后继续处理子串。
3 C++核心代码
去重1
class Solution {
public:
vector<string> result;
vector<string> Permutation(string str) {
if(str.length()==)
return result;
permutation1(str,);
sort(result.begin(), result.end());
return result;
}
void permutation1(string str, int begin){
if(begin==str.length())
{
result.push_back(str);
return;
}
for(int i = begin; str[i]!='\0'; i++) //每个元素与第一个元素交换
{
if(i!=begin && str[begin]==str[i]) //去重
continue;
swap(str[begin], str[i]);
permutation1(str, begin+); //交换后,得到子序列,用函数perm得到子序列的全排列
swap(str[begin], str[i]); //最后,将元素交换回来,复原,然后交换另一个元素
}
}
};
去重2 https://www.nowcoder.com/questionTerminal/fe6b651b66ae47d7acce78ffdd9a96c7
void PermutationHelp(vector<string> &ans, int k, string str) //遍历第k位的所有可能
{
if (k == str.size() - )
ans.push_back(str);
unordered_set<char> us;
//sort(str.begin() + k, str.end());//这个我不太懂,我把sort放到最后输出结果
for (int i = k; i < str.size(); i++)
{
if (us.find(str[i]) == us.end()) //只和没交换过的换
{
us.insert(str[i]);
swap(str[i], str[k]);
PermutationHelp(ans, k + , str);
swap(str[i], str[k]);
}
}
} vector<string> Permutation(string str) {
vector<string> ans;
PermutationHelp(ans, , str);
sort(ans.begin(), ans.end());
return ans;
}
4 C++完整代码
#include <stdio.h>
#include <vector>
#include <iostream>
#include <string> using namespace std; void swap(char &a, char &b) {
char temp = a;
a = b;
b = temp;
}
void permcore(string list, int low, int high, vector<string>& res) {
if (low == high &&
find(res.begin(), res.end(), list) == res.end()) { //去重
res.push_back(list);
}
else {
for (int i = low; i <= high; i++) {//每个元素与第一个元素交换
if (i == low || list[i] != list[low]) { //去重
swap(list[i], list[low]);
permcore(list, low + , high, res); //交换后,得到子序列,用函数perm得到子序列的全排列
swap(list[i], list[low]);//最后,将元素交换回来,复原,然后交换另一个元素
}
}
}
} vector<string> perm(string str)
{
vector<string> res;
if (!str.empty())
permcore(str, , str.size() - , res);
return res;
} int main()
{
vector<string> res;
string stdstr = "abb";
res = perm(stdstr);
for (auto s : res)
cout << s << endl;
cout << endl; string stdstr2 = "aab";
res = perm(stdstr2);
for (auto s : res)
cout << s << endl;
cout << endl; system("pause");
return ;
}
参考资料
https://blog.csdn.net/JarvisKao/article/details/76999473
剑指offer27:按字典序打印出该字符串中字符的所有排列的更多相关文章
- 输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
题目描述 输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba. 输入描述: 输 ...
- java输入一个字符串,打印出该字符串中字符的所有排列,随机打乱排序
import java.util.ArrayList;import java.util.Collections;import java.util.List; public class Test7{ ...
- java 输入一个字符串,打印出该字符串中字符的所有排列
import java.util.Scanner; public class Demo001 { public static void main(String[] args) { String str ...
- 剑指 offer set 20 打印出和为 s 的连续正序序列
题目 100 可以由 9~16, 或者 18 ~ 22 组成 思路 1. 与 Leetcode Container With Most Water 有些类似, 依然是平移题目. 但这道更加复杂 2. ...
- 剑指 offer set 14 打印 1 到 N 中 1 的个数
总结 1. 假设 n == 2212, 算法分为两个步骤. 第一步, 将这个 2212 个数分为 1~ 212, 213 ~ 2212 2. 第一部分实际上是将 n 的规模缩小到 212. 假如知道如 ...
- 剑指Offer-27.字符串的排列(C++/Java)
题目: 输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba. 输入描述: 输入 ...
- 字符串的排列(剑指offer-27)
题目描述 输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba. 输入描述: 输 ...
- 《剑指offer》面试题28:字符串的排列(牛客网版本) java
题目描述 输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba. 输入描述: 输 ...
- 剑指Offer(二十七):字符串的排列
剑指Offer(二十七):字符串的排列 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net/baid ...
随机推荐
- 2019UNCTF竞技赛部分writeup
Reverse unctf_babyre2 这题flag分为两部分,第一部分每四个字符一组打包成int后,每次把四个int传入函数,后三个参数异或后先以每位为索引查表,将新数据进行循环移位.异或,将结 ...
- Android根据内网外网连接情况配置服务器访问IP
新项目的app,可通过内网和外网的服务器ip进行请求访问,但是客户提供了专业终端,终端在wifi情况下走外网内网都可以,但关闭wifi则只能走4G专网,也就是只能走内网. 可前往我的小站查看:Andr ...
- pyinstaller参数介绍以及总结
最近利用tkinter+python+pyinstaller实现了小工具的项目,在此记录下pyinstaller相关参数以及爬过的坑. 一.pyinstaller相关参数 -F, –onefile 打 ...
- Java 从入门到进阶之路(十六)
在之前的文章我们介绍了一下 Java 中类的多态,本章我们来看一下 Java 中类的内部类. 在 Java 中,内部类分为成员内部类和匿名内部类. 我们先来看一下成员内部类: 1.类中套类,外面的叫外 ...
- 信息论 | information theory | 信息度量 | information measures | R代码(一)
这个时代已经是多学科相互渗透的时代,纯粹的传统学科在没落,新兴的交叉学科在不断兴起. life science neurosciences statistics computer science in ...
- Linux系列 | Ubuntu 各版本号和名称对照【转】
转载处:https://blog.csdn.net/songfulu/article/details/85310273 版本 开发代号 中译 发布日期 支持结束时间 内核版本 桌面版 服务器版 4 ...
- Status Code: 431 Request Header Fields Too Large
Status Code: 431 Request Header Fields Too Large
- K8S集群Master高可用实践
K8S集群Master高可用实践 https://blog.51cto.com/ylw6006/2164981 本文将在前文基础上介绍k8s集群的高可用实践,一般来讲,k8s集群高可用主要包含以 ...
- 小D课堂 - 零基础入门SpringBoot2.X到实战_第4节 Springboot2.0单元测试进阶实战和自定义异常处理_17、SpringBootTest单元测试实战
笔记 1.@SpringBootTest单元测试实战 简介:讲解SpringBoot的单元测试 1.引入相关依赖 <!--springboot程 ...
- Flutter Wrap 组件实现流布局
Wrap 可以实现流布局,单行的 Wrap 跟 Row 表现几乎一致,单列的 Wrap 则跟 Row 表 现几乎一致.但 Row 与 Column 都是单行单列的,Wrap 则突破了这个限制,main ...