字符串的全排列
来源:互联网 发布:淘宝热搜关键词排行榜 编辑:程序博客网 时间: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
- 字符串的全排列
- 字符串的全排列
- 字符串的全排列
- 字符串的全排列
- 字符串的全排列
- 字符串的全排列
- 字符串的全排列
- 字符串的全排列
- 字符串的全排列
- 字符串的全排列
- 字符串的全排列
- 字符串的全排列
- 字符串的全排列
- 字符串的全排列
- 字符串的全排列
- 字符串的全排列
- 字符串的全排列
- 字符串的全排列
- 关于archlinux 开机等待1min30s的问题
- Java关键字-transient
- 《代码整洁之道》精读与演绎】之一 让代码比你来时更干净
- Android组件通信之Intent完全解析
- 为您详细比较三个 CSS 预处理器(框架):Sass、LESS 和 Stylus
- 字符串的全排列
- Dagger2详解
- 【POJ3254】Corn Fields(状态压缩DP)
- (50)逻辑运算短路特型 与运算符优先级别
- java 面试可能所需的问题
- 基于Web的质量和测试度量指标
- cocoapods-xcode插件 下载
- PowerOJ 1100 最短的名字 字典树
- C++ int与string的转化(转)