《Cracking the Coding Interview》——第9章:递归和动态规划——题目5
2014-03-20 03:26
429 查看
2014-03-20 03:23
题目:给定一个字符串,输出其全排列。
解法:可以调用STL提供的next_permutation(),也可以自己写一个。对于这种看起来简单的题目,应该在能优化的地方,尽量想办法优化。在面试里如果大家都会做的题,你就得做的很好才能拉开差距,否则就等着thank you了。
代码:
题目:给定一个字符串,输出其全排列。
解法:可以调用STL提供的next_permutation(),也可以自己写一个。对于这种看起来简单的题目,应该在能优化的地方,尽量想办法优化。在面试里如果大家都会做的题,你就得做的很好才能拉开差距,否则就等着thank you了。
代码:
// 9.5 Print all permutations of a string. #include <algorithm> #include <cstdio> #include <cstring> using namespace std; void countingSort(char s[], int n) { static int c[256]; if (s == nullptr || n < 2) { return; } int i, j; memset(c, 0, 256 * sizeof(int)); for (i = 0; i < n; ++i) { ++c[s[i]]; } n = 0; for (i = 0; i < 256; ++i) { for (j = 0; j < c[i]; ++j) { s[n++] = i; } } s = 0; } bool myNextPermutation(char s[], int n) { if (s == nullptr) { return false; } int i; int ll, rr, mm; char ch; for (i = n - 2; i >= 0; --i) { if (s[i] < s[i + 1]) { ll = i + 1; rr = n - 1; break; } } if (i < 0) { return false; } if (s[rr] > s[i]) { ch = s[rr]; s[rr] = s[i]; s[i] = ch; } else { while (rr - ll > 1) { mm = (ll + rr) / 2; if (s[mm] > s[i]) { ll = mm; } else { rr = mm; } } ch = s[ll]; s[ll] = s[i]; s[i] = ch; } ll = i + 1; rr = n - 1; for (i = ll; i < ll + rr - i; ++i) { ch = s[i]; s[i] = s[ll + rr - i]; s[ll + rr - i] = ch; } return true; } int main() { char s[100]; int len; while (scanf("%s", s) == 1 && (len = strlen(s)) > 0) { countingSort(s, len); do { puts(s); } while (myNextPermutation(s, len)); } return 0; }
相关文章推荐
- 《Cracking the Coding Interview》——第9章:递归和动态规划——题目1
- 《Cracking the Coding Interview》——第9章:递归和动态规划——题目2
- 《Cracking the Coding Interview》——第9章:递归和动态规划——题目3
- 《Cracking the Coding Interview》——第9章:递归和动态规划——题目4
- 《Cracking the Coding Interview》——第9章:递归和动态规划——题目6
- 《Cracking the Coding Interview》——第9章:递归和动态规划——题目7
- 《Cracking the Coding Interview》——第9章:递归和动态规划——题目8
- 《Cracking the Coding Interview》——第9章:递归和动态规划——题目9
- 《Cracking the Coding Interview》——第9章:递归和动态规划——题目10
- 《Cracking the Coding Interview》——第9章:递归和动态规划——题目11
- 《Cracking the Coding Interview》——第13章:C和C++——题目9
- 《Cracking the Coding Interview》——第16章:线程与锁——题目4
- 《Cracking the Coding Interview》——第17章:普通题——题目7
- 《Cracking the Coding Interview》——第18章:难题——题目2
- 《Cracking the Coding Interview》——第1章:数组和字符串——题目3
- 《Cracking the Coding Interview》——第4章:树和图——题目4
- 《Cracking the Coding Interview》——第6章:智力题——题目2
- 《Cracking the Coding Interview》——第7章:数学和概率论——题目6
- 《Cracking the Coding Interview》——第17章:普通题——题目8
- 《Cracking the Coding Interview》——第18章:难题——题目3