字符串的排序

来源:互联网 发布:亚洲x站最新免费域名 编辑:程序博客网 时间:2024/06/15 14:16

何海涛:《剑指Offer:名企面试官精讲典型编程题》:九度OJ

题目描述:http://ac.jobdu.com/problem.php?cid=1039&pid=11

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

代码AC:

思想:全排列 问题!


 #include <iostream> #include <string> #include <cstdio> #include <cstdlib> #include <cstring> #include <algorithm> using namespace std;  void def_all(int dep, int dp, string &s, char ret[], bool ok[]) {     if (dep == dp)     {         ret[dep] = '\0';         printf("%s\n", ret);         return;     }      for(int i = 0; i < dp; i++)         if (ok[i])         {             if (i != 0 && s[i] == s[i-1] && ok[i-1])                 continue;              ok[i] = false;             ret[dep] = s[i];             def_all(dep + 1, dp, s, ret, ok);             ok[i] = true;         } }  int main() {     string s; bool ok[10];     while(cin >> s)     {         sort(s.begin(), s.end());         memset(ok, true, sizeof(ok));         char *ret = new char[s.size() + 1];         def_all(0, s.size(), s, ret, ok);         delete [] ret;     } return 0; }


原创粉丝点击