剑指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 ... 
随机推荐
- GO语言strconv包的使用
			Go语言中strconv包实现了基本数据类型和其字符串表示的相互转换. strconv包 strconv包实现了基本数据类型与其字符串表示的转换,官方文档中文版. string与int类型转换 Ato ... 
- elasticsearch type类型创建时注意项目,最新的elasticsearch已经不建议一个索引下多个type
			https://www.elastic.co/guide/cn/elasticsearch/guide/current/mapping.html如果有两个不同的类型,每个类型都有同名的字段,但映射不同 ... 
- c# lock TransactionScope
			c# lock TransactionScope TransactionOptions option = new TransactionOptions(); //option.IsolationLev ... 
- Spring boot MyBatis基本操作
			XML 配置方式 目录结构 数据库信息: 数据库student -> 表名 custom_user -> 主键-> custom_id ,其他字段 cusotm_name,cust ... 
- ubuntu之路——day7.2 regularization
			所有的正则化方法来自于吴恩达老师的免费公开课:https://mooc.study.163.com/learn/2001281003?tid=2001391036#/learn/content?typ ... 
- 第06组 Alpha冲刺(3/6)
			队名:拾光组 组长博客链接 作业博客链接 团队项目情况 燃尽图(组内共享) 组长:宋奕 过去两天完成了哪些任务 主要完成了用户论坛模块的接口设计 完善后端的信息处理 GitHub签入记录 接下来的计划 ... 
- 咏南中间件随LINUX开机自动启动
			咏南中间件随LINUX开机自动启动 LINUX DEAMON,LINUX也有类似WINDOWS的服务. program ynCrossServer; {$HINTS OFF} {$APPTYPE CO ... 
- React Hooks介绍和环境搭建(一)
			React Hooks 简介 2018年底FaceBook的React小组推出Hooks以来,所有的React的开发者都对它大为赞赏.React Hooks就是用函数的形式代替原来的继承类的形式,并且 ... 
- GIS自定义地理处理工具--极值提取
			GIS自定义地理处理工具--极值提取 关键词:最大值提取,最小值提取,极值提取,极小值提取,极大值提取 商务合作,科技咨询,版权转让:向日葵,135—4855__4328,xiexiaokui#qq. ... 
- Zabbix3.4指定用户才能收到报警的配置
			Zabbix3.4指定用户才能收到报警的配置 .下载python微信脚本 #安装simplejson wget https://pypi.python.org/packages/f0/07/26b51 ... 
