27、剑指offer--字符串的排列

题目描述

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

输入描述:

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

解题思路:本题求整个字符串的全排列可以看做两步

1)首先求出所有可能出现在第一位置的字母,即begin与后面所有与它不同的字母进行交换

2)固定第一个字母,求后面字母的全排列,即递归此时begin = begin+1

 1 #include <iostream>
 2 #include <string>
 3 #include <vector>
 4 #include <algorithm>
 5 using namespace std;
 6 class Solution {
 7 public:
 8     vector<string> Permutation(string str) {
 9         vector<string> a;
10         if(str.empty())
11             return a;
12         Permutation(a,str,0);
13         sort(a.begin(),a.end());//按照字典序输出
14         return a;
15      }
16      void Permutation(vector<string> &array, string str, int begin)//遍历第begin位的所有可能性
17      {
18         //一次遍历的结束条件
19         if(begin == str.size()-1)
20         {
21             array.push_back(str);
22         }
23         for(int i=begin;i<str.size();i++)
24         {
25             if(i!=begin && str[i] == str[begin])
26             {
27                 continue;//有与begin位重复的字符串不进行交换,跳过
28             }
29             swap(str[i],str[begin]);
30             //当i==begin时,也要遍历其后面的所有字符
31             //当i!=begin时,先交换,使第begin位取到不同的可能字符,再遍历后面的字符
32             Permutation(array,str,begin+1);
33             swap(str[i],str[begin]);//为了防止重复的情况,还需要将begin处的元素重新换回来
34         }
35      }
36 };
37 int main()
38 {
39     string a = "abc";
40     Solution s;
41     vector<string> b;
42     b = s.Permutation(a);
43     for(int i=0;i<b.size();i++)
44     {
45         cout<<b[i]<<endl;
46     }
47     return 0;
48 }

时间: 2024-08-02 19:49:29

27、剑指offer--字符串的排列的相关文章

[剑指offer] 字符串的顺序全排列

题目描述 输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba. 结果请按字母顺序输出. 输入描述 输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母. 输出描述 顺序输出字符串的所有排列 题目分析 这是一个字符串全排列的问题,把全部序列存在TreeSet中默认可得到字典顺序. TreeSet 基于TreeMap实现的SortedSet,可以对Set集合中的元

剑指offer28 字符串的排列

1.全局变量可以在最后去定义并初始化,不一定非要在开头 2.此题有一种特殊情况需要考虑,比如字符串是"aa",那输出应该是"aa",而不是"aa,aa",即相同的不输出.实现这个处理用了c++中的容器set,set不保存重复元素.在存储的时候,遇到相同的元素,set不会把相同的元素保存进set.clear是清空set中的元素. 3. class Solution { public: vector<string> Permutation

剑指offer—字符串转换整数

对于这个问题, 本题考查的实际上就是字符串转换成整数的问题,或者说是要你自行实现atoi函数.那如何实现把表示整数的字符串正确地转换成整数呢?以"345"作为例子: 当我们扫描到字符串的第一个字符'3'时,由于我们知道这是第一位,所以得到数字3. 当扫描到第二个数字'4'时,而之前我们知道前面有一个3,所以便在后面加上一个数字4,那前面的3相当于30,因此得到数字:3*10+4=34. 继续扫描到字符'5','5'的前面已经有了34,由于前面的34相当于340,加上后面扫描到的5,最终

剑指offer 把数组排列成最小的数字

class Solution { public: static bool larger(const string& a, const string& b){ if(a.empty()) return false; if(b.empty()) return true; int i = 0; while( i < a.size() && i < b.size()){ if(a[i] > b[i]) return false; else if(a[i] <

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

题目描述 输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba. 输入描述:输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母. 题目分析 这题还算可以,关于全排列,有两种解法,第一种就是递归全排列法,第二种就是回溯法. 递归全排列法: 就是剑指offer上的做法,也比较容易理解,不过挺少人答的也就是 把字符串分为两部分:第一部分为第一个字符,第二部分为第一个

【剑指offer】字符串的排列

转载请注明出处:http://blog.csdn.net/ns_code/article/details/26390551 题目描述: 输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba. 输入: 每个测试案例包括1行. 输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母. 输出: 对应每组数据,按字典序输出所有排列. 样例输入: abc BCA 样例输出:

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

题目描述 输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba. 输入描述: 输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母. 这里尤其需要注意2点:1.所有组合不能重复,比如输入"aa",  那么输出的结果应当是"aa" : 2. 输出结果按字典序排序 如果用<剑指offer>上的方法,显然这两点都不能满足,比如

【剑指offer】字符串的组合

转载请注明出处:http://blog.csdn.net/ns_code/article/details/26405471 剑指offer上的拓展题目,输入一个字符串,输出该字符串的字符的所有组合,比如输入字符串:abc,输出a.b.c.ab.ac.bc.abc. 思路:与上一题类似,也可以用递归求解.可以考虑求长度为n的字符串中m个字符的组合,设为C(n,m).原问题的解即为C(n, 1), C(n, 2),...C(n, n)的总和.对于求C(n, m),从第一个字符开始扫描,每个字符有两种

剑指offer之【表示数值的字符串】

题目: 表示数值的字符串 链接: https://www.nowcoder.com/practice/6f8c901d091949a5837e24bb82a731f2?tpId=13&tqId=11206&rp=3&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking 题目描述: 请实现一个函数用来判断字符串是否表示数值(包括整数和小数).例如,字符串"+100",&quo

剑指offer (49) 字符串转数字

class Test { public: Test() : n2(0), n1(n2 + 2) { } private: int n1; int n2; }; 调用构造函数之后,n1个n2各为多少? 分析:构造函数的初始化顺序仅仅取决于成员变量的声明顺序,所以这是 应该是 n1先初始化,然后是n2初始化 当n1初始化值 = n2值 + 2,此时n2并没有初始化,n2为内置类型并且是non-static,所以n2此时为随机值 故 n1 为随机值,n1初始完之后,n2初始化为0 最终 n1为随机值,