面试题28 字符串的全排列
来源:互联网 发布:unity3d抗锯齿设置 编辑:程序博客网 时间:2024/05/17 01:41
1、题目
输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a、b、c所能排列出来的所有字符串abc、acb、bac、bca、cab、cba。
2、解题分析
把复杂的问题分解成小问题。把一个字符串看成由两部分组成:第一部分为它的第一个字符,第二部分是后面的所有字符。如图1所示。
在求整个字符串的排列时,看成两步:首先求所有可能出现在第一个位置的字符,即把第一个字符和后面所有的字符交换。如图1所示。首先固定第一个字符,求后面所有字符的排列。这时候我们仍把后面的所有字符分成两部分:后面字符的第一个字符,以及这个字符之后的所有字符。然后把第一个字符逐一和它后面的字符交换。
图1 求字符串的排列的过程
3、参考代码
- void Permutation(char* pStr, char* pBegin);
- void Permutation(char* pStr)
- {
- if(pStr == NULL)
- return;
- Permutation(pStr, pStr);
- }
- void Permutation(char* pStr, char* pBegin)
- {
- if(*pBegin == '\0')
- {
- printf("%s\n", pStr);
- }
- else
- {
- for(char* pCh = pBegin; *pCh != '\0'; ++ pCh)
- {
- char temp = *pCh;
- *pCh = *pBegin;
- *pBegin = temp;
- Permutation(pStr, pBegin + 1);
- temp = *pCh;
- *pCh = *pBegin;
- *pBegin = temp;
- }
- }
- }
- // ====================测试代码====================
- void Test(char* pStr)
- {
- if(pStr == NULL)
- printf("Test for NULL begins:\n");
- else
- printf("Test for %s begins:\n", pStr);
- Permutation(pStr);
- printf("\n");
- }
- int _tmain(int argc, _TCHAR* argv[])
- {
- Test(NULL);
- char string1[] = "";
- Test(string1);
- char string2[] = "a";
- Test(string2);
- char string3[] = "ab";
- Test(string3);
- char string4[] = "abc";
- Test(string4);
- return 0;
- }
0 0
- 面试题28 字符串的全排列
- 【面试题】剑指Offer-28-字符串的全排列
- 剑指offer面试题28 字符串的全排列
- 面试题_28——字符串的全排列
- 【面试题之算法部分】字符串的全排列
- 百度面试题 字符串的全排列输出
- 经典面试题之字符串的全排列
- 面试题28:全排列
- 剑指offer 面试题28 字符串全排列
- 笔试面试题(9)----字符串全排列
- 面试题28:字符串的排列
- 面试题28:字符串的排列
- 面试题28:字符串的排列
- 面试题28:字符串的排列
- 面试题28:字符串的排列
- 面试题28:字符串的排列
- 面试题28:字符串的排列
- 面试题28字符串的排列
- HDU 4998 Rotate(计算几何 绕点旋转)
- scanf函数的返回值问题
- Unable to locate package错误解决办法
- 超级简单的 AngularJS 应用 —— 实时创建 vCard
- [腾讯笔试] 2015腾讯校园招聘笔试题(西安站)
- 面试题28 字符串的全排列
- 如何使用axis构建SOAP应用程序
- 121221
- 使用sar工具进行cpu/mem/io/network等性能分析
- WCF学习笔记—Overview
- 2015腾讯软开类笔试题(回忆版)
- 数据挖掘、数据分析、海量数据处理的面试题(总结july的博客)
- 编写函数求两个整数 a 和 b 之间的较大值。要求不能使用if, while, switch, for, ?: 以及任何的比较语句
- cadence16.5中总线拓扑的设置方法