题目描述:

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

输入描述:

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

分析:

全排列。

  1. 先从小到大排序。
  2. 从后往前找到相邻两个值,左边<右边的。
  3. 从后往前找到第一个大于左边的数。
  4. 交换倒数第一个大于左边的数和左边的数。
  5. 将右边到末尾的数全部翻转。
  6. 循环上面2-5步,直到找不到左边<右边的情况。

代码:

 class Solution {
public:
vector<string> Permutation(string str) {
vector<string> permutations;
if(str == "") return permutations;
sort(str.begin(), str.end());
do {
permutations.push_back(str);
} while(next_permutation(str.begin(), str.end()));
return permutations;
}
};
 class Solution {
public:
vector<string> Permutation(string str) {
vector<string> permutations;
if(str == "") return permutations;
sort(str.begin(), str.end());
permutations.push_back(str); // 加入排序后的第一组排列
int strLen = str.length();
int i = strLen - ;
while(true) {
int i1 = i--;
if(i >= && str[i] < str[i1]) { // 找到相邻两个值,左边<右边的
int i2 = strLen - ;
while(!(str[i] < str[i2])) i2--; // 从后往前找到第一个大于左边的数
swap(str[i], str[i2]); // 交换倒数第一个大于左边的数和左边的数
reverse(str.begin() + i1, str.end()); // 将右边到末尾的数全部翻转
permutations.push_back(str);
i = strLen - ;
continue;
}
if(i <= ) break; // 数组中没有数左边<右边,排列结束
}
return permutations;
}
};

剑指Offer——字符串的排列的更多相关文章

  1. leetcode46. Permutations 、47. Permutations II、 剑指offer字符串的排列

    字符串排列和PermutationsII差不多 Permutations第一种解法: 这种方法从0开始遍历,通过visited来存储是否被访问到,level代表每次已经存储了多少个数字 class S ...

  2. 用js刷剑指offer(字符串的排列)

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

  3. 剑指offer28 字符串的排列

    1.全局变量可以在最后去定义并初始化,不一定非要在开头 2.此题有一种特殊情况需要考虑,比如字符串是“aa”,那输出应该是“aa”,而不是“aa,aa”,即相同的不输出.实现这个处理用了c++中的容器 ...

  4. 剑指Offer——字符串的排序

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

  5. 剑指offer--9.字符串的排列

    next_permutation(),还是那个feel ------------------------------------------------------------------------ ...

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

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

  7. 剑指offer字符串列表

    字符串 面试题5:替换空格 面试题20:表示数值的字符串 面试题58:翻转字符串 面试题58(二):左旋转字符串

  8. 剑指offer字符串1

    面试题5:替换空格 请实现一个函数,将一个字符串中的每个空格替换成“%20”.例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy. class Solu ...

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

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

随机推荐

  1. CentOS 6.2下SVN安装与使用

    1.安装 CentOS安装TortoiseSVN yum install -y subversion 2.常用命令详解 1.将文件checkout到本地目录svn checkout path(path ...

  2. oracle锁表,杀死进程

    查询锁表数据 select object_name,machine,s.sid,s.serial#from v$locked_object l,dba_objects o ,v$session swh ...

  3. mem_fun与mem_fun_ref的区别

    一句话:container<ClassType*>就用mem_fun,container<ClassType>就用mem_fun_ref 参考: http://www.cplu ...

  4. IIS 与 Apache共存

    http://support.microsoft.com/kb/813368 http://www.blueidea.com/computer/system/2006/3585.asp 操作其实也很简 ...

  5. Unix系统编程()信号:概念和概述

    这篇将一口气学完信号的基本概念,但是有很多的细节,所以篇幅较长,请做好心理准备. (他大爷的,一口气没有学完,太懒了) 有以下主题: 各种不同信号及其用途 内核可能为进程产生信号的环境,以及某一进程向 ...

  6. hive表分区的修复

    hive从低版本升级到高版本或者做hadoop的集群数据迁移时,需要重新创建表和表分区,由于使用的是动态分区,所以需要重新刷新分区表字段,否则无法查看数据. 在hive中执行中以下命令即可自动更新元数 ...

  7. JavaScript概述.pdf

    第1章 JavaScript概述 第2章 使用JavaScript 第3章 语法.关键保留字及变量 第4章 数据类型 第5章 运算符 第6章 流程控制语句 第7章 函数 //没有参数的函数 funct ...

  8. 数学 + 带权中位数 - SGU 114 Telecasting station

    Telecasting station Problem's Link Mean: 百慕大的每一座城市都坐落在一维直线上,这个国家的政府决定建造一个新的广播电视台. 经过了许多次试验后,百慕大的科学家们 ...

  9. 利用CSS生成精美细线Table表格

    精美的表格是前端开发用到的一个组件,很多时候我们利用复杂的页面style代码,来生成这样的表格,造成了页面的修改性和可读性都非常差.这里推荐直接使用css来产生一个细线表格. 使用方法也很简单: 第一 ...

  10. Codeforces Round #265 (Div. 2)

    http://codeforces.com/contest/465 rating+7,,简直... 感人肺腑...............蒟蒻就是蒟蒻......... 被虐瞎 a:inc ARG 题 ...