剑指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 ...
随机推荐
- 开源GIT仓库-----gitlab
简介:GitLab是一个利用 Ruby on Rails 开发的开源应用程序,实现一个自托管的Git项目仓库,可通过Web界面进行访问公开的或者私人项目.它拥有与Github类似的功能,能够浏览源代码 ...
- jQuery学习笔记——基本了解
安装 两种方法: 从 jquery.com 下载jQuery. 从 CDN 中载入 jQuery, 如从我的博客中加载 jQuery: <script src="https://blo ...
- ubuntu之路——day7.4 梯度爆炸和梯度消失、初始化权重、梯度的数值逼近和梯度检验
梯度爆炸和梯度消失: W[i] > 1:梯度爆炸(呈指数级增长) W[i] < 1:梯度消失(呈指数级衰减) *.注意此时的1指单位矩阵,W也是系数矩阵 初始化权重: np.random. ...
- 降维算法整理--- PCA、KPCA、LDA、MDS、LLE 等
转自github: https://github.com/heucoder/dimensionality_reduction_alo_codes 网上关于各种降维算法的资料参差不齐,同时大部分不提供源 ...
- GROUP_CONCAT 将mysql多条数据合并为一条
实现将多条数据合并为一条数据,在mysql中可以通过 GROUP_CONCAT 函数实现 上面是潇leader发我的和工作不相关的小小小需求描述,很明显是要把id和name相同的数据合并为一条,下面按 ...
- 前端 img标签显示 base64格式的 图片
本文链接:https://blog.csdn.net/kukudehui/article/details/80409522在做项目的时候,我从后端返回了一个base64格式的图片文件,想把它渲染在前端 ...
- Linux下Mycat安装配置和使用
mysql安装下载mysql[百度云]tar -zxvf mysql-5.6.32-linux-glibc2.5-x86_64.tar.gz 解压把mysql文件夹移动到 /usr/local/ 下m ...
- 123457123456#2#----com.ppGame.XueYingYu76--前拼后广--儿童英语_pp
com.ppGame.XueYingYu76--前拼后广--儿童英语_pp
- 123457123456#0#----com.ppGame.HappyShuXue54--前拼后广--儿童数学_pp
com.ppGame.HappyShuXue54--前拼后广--儿童数学_pp
- python中多层循环的一键退出
在单层循环的退出中,使用break即能退出,那么多层循环呢?机智的人们使用flag标识符的方式,例如: a=['a',1,2,3,4] b=['b',1,2,3,4] c=['c',1,2,3,4] ...