您的位置:首页 > 其它

《Cracking the Coding Interview》——第9章:递归和动态规划——题目5

2014-03-20 03:26 429 查看
2014-03-20 03:23

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

解法:可以调用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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐