字符串的全排列

来源:互联网 发布:淘宝热搜关键词排行榜 编辑:程序博客网 时间:2024/06/03 18:30

对应剑指offer中的面试题28:字符串的排列

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

思路:我们求整个字符串的排列,可以看出两部:首先求出可能出现在第一个位置的字符,即把第一个字符和后面所有的字符交换。

拿ABC做例子,也就是将A分别和B、C交换,得到BAC和CBA。如下图所示。

第二步呢,就固定第一个字符,求后面所有字符的排列。这个时候我们仍然把后面的所有字符分成两个部分:

后面字符的第一个字符,以及这个字符之后的所有字符,然后再次把第一个字符逐一和后面的字符交换。

显然,这是一个递归的过程,递归树如下图所示。


代码如下:

#include <iostream>#include <string>#include <cstdio>using namespace std;void swap(char* x, char* y){char tmp;tmp = *x;*x = *y;*y = tmp;}/* Function to print permutations of stringThis function takes three parameters:1. String2. Starting index of the string3. Ending index of the string. */void permute(char *a, int i, int n){int j;if (i == n)printf("%s\n", a);else{for (j = i; j <= n; j++){if (a[i] == a[j] && j != i)  //为避免生成重复排列,当不同位置的字符相同时不再交换continue;swap((a + i), (a + j));permute(a, i + 1, n);swap((a + i), (a + j)); //backtrack}}}int main(){//method2cout << "method2" << endl;char a[] = "ABC";permute(a, 0, 2);return 0;}



0 0
原创粉丝点击