zoukankan      html  css  js  c++  java
  • 《Cracking the Coding Interview》——第9章:递归和动态规划——题目5

    2014-03-20 03:23

    题目:给定一个字符串,输出其全排列。

    解法:可以调用STL提供的next_permutation(),也可以自己写一个。对于这种看起来简单的题目,应该在能优化的地方,尽量想办法优化。在面试里如果大家都会做的题,你就得做的很好才能拉开差距,否则就等着thank you了。

    代码:

     1 // 9.5 Print all permutations of a string.
     2 #include <algorithm>
     3 #include <cstdio>
     4 #include <cstring>
     5 using namespace std;
     6 
     7 void countingSort(char s[], int n)
     8 {
     9     static int c[256];
    10     
    11     if (s == nullptr || n < 2) {
    12         return;
    13     }
    14     
    15     int i, j;
    16     
    17     memset(c, 0, 256 * sizeof(int));
    18     for (i = 0; i < n; ++i) {
    19         ++c[s[i]];
    20     }
    21     
    22     n = 0;
    23     for (i = 0; i < 256; ++i) {
    24         for (j = 0; j < c[i]; ++j) {
    25             s[n++] = i;
    26         }
    27     }
    28     s[n] = 0;
    29 }
    30 
    31 bool myNextPermutation(char s[], int n)
    32 {
    33     if (s == nullptr) {
    34         return false;
    35     }
    36     
    37     int i;
    38     int ll, rr, mm;
    39     char ch;
    40     
    41     for (i = n - 2; i >= 0; --i) {
    42         if (s[i] < s[i + 1]) {
    43             ll = i + 1;
    44             rr = n - 1;
    45             break;
    46         }
    47     }
    48     
    49     if (i < 0) {
    50         return false;
    51     }
    52     
    53     if (s[rr] > s[i]) {
    54         ch = s[rr];
    55         s[rr] = s[i];
    56         s[i] = ch;
    57     } else {
    58         while (rr - ll > 1) {
    59             mm = (ll + rr) / 2;
    60             if (s[mm] > s[i]) {
    61                 ll = mm;
    62             } else {
    63                 rr = mm;
    64             }
    65         }
    66         ch = s[ll];
    67         s[ll] = s[i];
    68         s[i] = ch;
    69     }
    70     
    71     ll = i + 1;
    72     rr = n - 1;
    73     for (i = ll; i < ll + rr - i; ++i) {
    74         ch = s[i];
    75         s[i] = s[ll + rr - i];
    76         s[ll + rr - i] = ch;
    77     }
    78     return true;
    79 }
    80 
    81 int main()
    82 {
    83     char s[100];
    84     int len;
    85     
    86     while (scanf("%s", s) == 1 && (len = strlen(s)) > 0) {
    87         countingSort(s, len);
    88         do {
    89             puts(s);
    90         } while (myNextPermutation(s, len));
    91     }
    92     
    93     return 0;
    94 }
  • 相关阅读:
    2020-2021-1学期 20202424 《网络空间安全导论》第一周学习总结
    斐波那契数列
    第五周学习总结
    第四周学习总结
    黑客偶像
    第三周学习总结
    关于罗马数字转换成阿拉伯数字的理解
    十进制转二进制(python转换代码)
    第二周学习总结
    师生关系
  • 原文地址:https://www.cnblogs.com/zhuli19901106/p/3612793.html
Copyright © 2011-2022 走看看