题目描述:

输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串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. cocos2d-x中CCEditbox导出到lua

    自从工作后感觉时间较少(每天工作9-22,晚上就不想动了,早上想多睡点),工作中用的是 cocos2d-x.cocos2d-x是一款手机游戏引擎,虽然支持lua,但和love2d相比非纯lua游戏引 ...

  2. 广义线性模型 - Andrew Ng机器学习公开课笔记1.6

    在分类问题中我们如果: 他们都是广义线性模型中的一个样例,在理解广义线性模型之前须要先理解指数分布族. 指数分布族(The Exponential Family) 假设一个分布能够用例如以下公式表达, ...

  3. Android基础总结(十一)Fragment,动画

    Fragment(重要) 用途:在一个Activity里切换界面,切换界面时只切换Fragment里面的内容 生命周期方法跟Activity一致,可以理解把其为就是一个Activity fragmen ...

  4. mysql_windows解压包安装

    WIN下安装64位的解压版mysql-5.6.24-winx64 参考如下安装步骤: 1.将解压缩后的文件放到自己想要的地方 并配置环境变量. 示例中存放的目录为:D:\Program Files\m ...

  5. 常用的easyui使用方法

    -------datagrid 1.获取某行的行号(row)tdg.datagrid('getRowIndex',rows)2.通过行号移除该行tdg.datagrid('deleteRow',ind ...

  6. js调绝对定位的top

    $("ggg div").each(function () {                this.style.top = (parseFloat(this.style.top ...

  7. ThinkPHP项目笔记之RBAC(权限)补充篇

    这里,主要补充的是配置以及相关代码问题. <?php return array( //'配置项'=>'配置值' 'RBAC_SUPERADMIN' => 'admin',//超级管理 ...

  8. 『Spring.NET+NHibernate+泛型』框架搭建之DAO(三)★

    本节内容介绍Nhibernate所封装的数据库訪问层.只是我增加了泛型进行封装.大概思路:首先,我们有一个接口层,另一个相应的实现层.在接口层中我们先定义一个父接口,父接口中定义每个接口都可能会用到的 ...

  9. [转]Shell脚本中获取SELECT结果值的方法

    http://blog.itpub.net/13885898/viewspace-1670297/ 有时候我们可能会需要在Shell脚本中执行SELECT语句,并将结果赋值给一个变量,对于这样的情形, ...

  10. ios开发之 -- invalid nib registered for identifier

    今天在写代码的时候,碰到这麽一个问题: invalid nib registered for identifier (重用符) - nib must contain exactly one top l ...