1 题目描述

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

输入描述:

  输入一个字符串,长度不超过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:按字典序打印出该字符串中字符的所有排列的更多相关文章

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

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

  2. java输入一个字符串,打印出该字符串中字符的所有排列,随机打乱排序

    import java.util.ArrayList;import java.util.Collections;import java.util.List; public class Test7{   ...

  3. java 输入一个字符串,打印出该字符串中字符的所有排列

    import java.util.Scanner; public class Demo001 { public static void main(String[] args) { String str ...

  4. 剑指 offer set 20 打印出和为 s 的连续正序序列

    题目 100 可以由 9~16, 或者 18 ~ 22 组成 思路 1. 与 Leetcode Container With Most Water 有些类似, 依然是平移题目. 但这道更加复杂 2. ...

  5. 剑指 offer set 14 打印 1 到 N 中 1 的个数

    总结 1. 假设 n == 2212, 算法分为两个步骤. 第一步, 将这个 2212 个数分为 1~ 212, 213 ~ 2212 2. 第一部分实际上是将 n 的规模缩小到 212. 假如知道如 ...

  6. 剑指Offer-27.字符串的排列(C++/Java)

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

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

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

  8. 《剑指offer》面试题28:字符串的排列(牛客网版本) java

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

  9. 剑指Offer(二十七):字符串的排列

    剑指Offer(二十七):字符串的排列 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net/baid ...

随机推荐

  1. GO语言strconv包的使用

    Go语言中strconv包实现了基本数据类型和其字符串表示的相互转换. strconv包 strconv包实现了基本数据类型与其字符串表示的转换,官方文档中文版. string与int类型转换 Ato ...

  2. elasticsearch type类型创建时注意项目,最新的elasticsearch已经不建议一个索引下多个type

    https://www.elastic.co/guide/cn/elasticsearch/guide/current/mapping.html如果有两个不同的类型,每个类型都有同名的字段,但映射不同 ...

  3. c# lock TransactionScope

    c# lock TransactionScope TransactionOptions option = new TransactionOptions(); //option.IsolationLev ...

  4. Spring boot MyBatis基本操作

    XML 配置方式 目录结构 数据库信息: 数据库student -> 表名 custom_user  -> 主键-> custom_id ,其他字段 cusotm_name,cust ...

  5. ubuntu之路——day7.2 regularization

    所有的正则化方法来自于吴恩达老师的免费公开课:https://mooc.study.163.com/learn/2001281003?tid=2001391036#/learn/content?typ ...

  6. 第06组 Alpha冲刺(3/6)

    队名:拾光组 组长博客链接 作业博客链接 团队项目情况 燃尽图(组内共享) 组长:宋奕 过去两天完成了哪些任务 主要完成了用户论坛模块的接口设计 完善后端的信息处理 GitHub签入记录 接下来的计划 ...

  7. 咏南中间件随LINUX开机自动启动

    咏南中间件随LINUX开机自动启动 LINUX DEAMON,LINUX也有类似WINDOWS的服务. program ynCrossServer; {$HINTS OFF} {$APPTYPE CO ...

  8. React Hooks介绍和环境搭建(一)

    React Hooks 简介 2018年底FaceBook的React小组推出Hooks以来,所有的React的开发者都对它大为赞赏.React Hooks就是用函数的形式代替原来的继承类的形式,并且 ...

  9. GIS自定义地理处理工具--极值提取

    GIS自定义地理处理工具--极值提取 关键词:最大值提取,最小值提取,极值提取,极小值提取,极大值提取 商务合作,科技咨询,版权转让:向日葵,135—4855__4328,xiexiaokui#qq. ...

  10. Zabbix3.4指定用户才能收到报警的配置

    Zabbix3.4指定用户才能收到报警的配置 .下载python微信脚本 #安装simplejson wget https://pypi.python.org/packages/f0/07/26b51 ...