题目描述:

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

输入:

每个测试案例包括1行。

输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。

输出:

对应每组数据,按字典序输出所有排列。

样例输入:

abc
BCA

样例输出:

abc
acb
bac
bca
cab
cba
ABC
ACB
BAC
BCA
CAB
CBA

【解题思路】由于需要字典序,首先肯定是要先对所给的字符串进行排序,然后很容易想到穷举法,但这边穷举法还有要避免重复,所以,有一定的技巧。我们有三个元素abb,最后输出时三元组,则我们可以将三个位置都看做由所有元素来填充的序列。负责度应该是一个n的n次方,但中间可以有一些剪枝。

由于n的大小不固定,我们没法确定是几层循环,所以只能用递归操作来进行遍历。对每一次递归调用都遍历n个元素哪个适合加入到结果队列res中,同时,我们设置一个used变量来控制某个元素是否已经在res中,避免重复添加。当检测到res的长度已经等于n,也即res中包含了所有的元素,则res中存在了一个合法的输出,我们输出结果。

当然,对于abb这种情况,我们需要对bb做特殊处理即我们不会输出1 2 3这种情况,至会输出1 3 2这种排列。具体就是当检测到某元素与之前的元素相等时我们跳过该元素。对于abb这种情况,遍历的顺序见下图。

AC code:

#include <cstdio>
#include <vector>
#include <string>
#include <iostream>
#include <algorithm>
using namespace std; void permutation(vector<char> &res,string &str,vector<int> &used)
{
if(res.size()==str.length())
{
for(int i=0;i<res.size();++i)
printf("%c",res[i]);
printf("\n");
return;
}
for(int i=0;i<str.length();++i)
{
if(used[i] || (i!=0 && str[i]==str[i-1] && used[i-1]))
continue;
used[i]=1;
res.push_back(str[i]);
permutation(res,str,used);
used[i]=0;
res.pop_back();
}
} int main()
{
string strin;
while(cin>>strin)
{
vector<int> used(10,0);
sort(strin.begin(),strin.end());
vector<char> res;
permutation(res,strin,used);
}
return 0;
}
/**************************************************************
Problem: 1369
User: huo_yao
Language: C++
Result: Accepted
Time:530 ms
Memory:1520 kb
****************************************************************/

最新文章

  1. UI第十四节——UIAlertController
  2. Java IO流学习总结(转)
  3. Keil C51软件的使用
  4. codeforces #332 div2
  5. bool operator==(const Array&amp;)const; 这最后一个const 是做什么用的
  6. 【Android-UI】包含多个子View时触发父节点的焦点事件
  7. python之全局变量与局部变量
  8. Struts2学习(一)————Struts2入门
  9. Solution for unable to create &quot;dead-letter-exchange&quot; in RabbitMQ
  10. Android SurfaceView内容获取
  11. 2.3《想成为黑客,不知道这些命令行可不行》(Learn Enough Command Line to Be Dangerous)——重命名,复制,删除
  12. [Deep-Learning-with-Python]机器学习基础
  13. 一个Python开源项目-哈勃沙箱源码剖析(下)
  14. paas平台
  15. git rm删除
  16. zoj2893 Evolution(矩阵快速幂)
  17. PHP 官方发行版扩展下载地址
  18. Android网络开发之HttpURLConnection
  19. docker学习-docker核心技术
  20. 微软正式发布Windows 1.0 回顾历代Windows版本界面

热门文章

  1. vue项目打包后运行报错400如何解决
  2. 计算机二级-C语言-程序设计题-190118记录-通过数组和指针两种方式对字符串进行处理。
  3. vCPU 和 CPU 的关系
  4. idea垂直分屏
  5. 从数据库中取数据(Stalberg.TMS.Data)
  6. ubuntu mysql允许root用户远程登录
  7. Spring学习(九)
  8. 吴裕雄--天生自然Numpy库学习笔记:NumPy 创建数组
  9. 在java的静态方法中访问类的实例成员
  10. RestTemplate的异常 Not enough variables available to expand