/***************************************************************
题目:输入一个字符串,打印出该字符串中字符的所有排列。例如输入
字符串abc,则打印出由a、b、c所能排列出来的所有字符串abc、acb、
bac、cab和cba。
***************************************************************/
#include<stdio.h>
void stringPermutation(char* pStr, char* pBegin);
void stringPermutation(char* pStr)
{
if(pStr == NULL)
return;
stringPermutation(pStr,pStr);
}
void stringPermutation(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;
stringPermutation(pStr,pBegin+1);
temp = *pCh; //将子字符串第一个字符交换回来
*pCh = *pBegin;
*pBegin = temp;
}
}
}
void test()
{
char pStr[] = "abc"; //注意这里不能写成char* pStr = "abc";
stringPermutation(pStr);
}
int main()
{
test();
return 0;
}
相关题目:
1.输入一些字符,求这些字符的所有组合。比如输入a,b,c,则它们的组合有
a,b,c,ab,ac,bc,abc。
解题思路:
如果输入n个字符,则这n个字符能构成长度为1的组合、长度为2的组合.....
长度为n的组合。在求n个字符的长度为m(1<=m<=n)的组合的时候,我们把这n
个字符分成两部分:第一个字符和其余的所有字符。如果组合包含第一个字符,
则下一步在剩余的字符里选取m-1个字符;如果组合里不包含第一个字符,则下
一步在剩余的n-1个字符里选取m个字符。也就是说,我们可以把求n个字符组成
长度为m的组合问题分解成了两个子问题,分别求n-1个字符串中长度为m-1的组合,
以及求n-1个字符的长度为m的组合。这两个子问题都可以用递归的方式解决。
2.输入一个含有8个数字的数组,判断有没有可能把这8个数字分别放到正方体
的8个定点上,使得正方体上三组相对的面上的4个顶点的和都相等。
解题思路:
这相当于先得到a1,a2,a3,a4,a5,a6,a7,a8这八个数字的所有排列,然后判断
有没有某一个排列符合题目给定的条件,即s2+a2+a3+a4=a5+a6+a7+a8,
a1+a3+a5+a7=a2+a4+a6+a8,并且a1+a2+a5+a6=a3+a4+a7+a8.
3.在8*8的国际象棋上摆放8个皇后,使其不能相互攻击,即任意两个皇后不得
处在同一行、同一列或者同一对角线上。请问总共有多少种符合条件的摆法。
解题思路:
由于8个皇后的任意两个不能处在同一行,那么肯定是每一个皇后占据一行。
于是我们可以定义一个数组ColumnIndex[8],数组中第i个数字表示位于第i行
的皇后的列号。先把数组ColumnIndex的8个数字分别用0~7初始化,接下来就是
对数组ColumnIndex做全排列。因为我们是用不同的数字初始化数组,所以任意
两个皇后肯定不同列。我们只需要判断每一个排列对应的8个皇后是不是在同一
对角线上,也就是对于数组的两个下标i和j,是不是i-j=ColumnIndex[i]-ColumIndex[j]
或者j-i=ColumnIndex[i]-ColumnIndex[j]。
相关题目1的答案void AllSubstring3(const char *str,char *arr)
{
//传入的arr的长度为len+1,最后一个位置保存'\0'
int i,j;
unsigned int len = strlen(str);
strcpy(arr,str);
for(i=len-1;i>=0;i--)
{
arr[i+1] = '\0';
for(j=i;j>=0;j--)
printf("%s\t",&arr[j]);
printf("\n");
}
}
总结:
如果面试题是按照一定要求摆放若干个数字,我们可以先求出这些数字
的所有排列,然后再一一判断每个排列是不是满足题目给定的要求。
==参考剑指offer 和http://blog.csdn.net/ns_code/article/details/21043665
分享到:
相关推荐
实现字符串所有组合数,以及全排列
PHP多个字符串排列组合的算法,组二,组三,彩票统计中奖注数的算法中会经常用到
问题描述: 键盘输入一个仅由小写字母组成的字符串,输出以该串中任 取M个字母的所有排列及排列总数。 例如:输入字符串abcd,输入m=3 则输出为:abc,abd,acd,bcd,n=4
列出字符串的全部排列组合,没有考虑重复字符串。
编写函数void fun(char *s,char *t,char *p)将未在字符串s中出现、而在字符串t中出现的字符, 形成一个新的字符串放在p中,p中字符按原字符串中字符顺序排列,但去掉重复字符。 例如: 当s为"12345", t为"8624677"时, p...
给定一个字符串,输出该字符串所有可能的排列
本文实例讲述了php一个解析字符串排列数组的方法。分享给大家供大家参考。具体如下: <?php $str=1|苹果|30 1|桃子|50 1|普通|10 2|小麦|100 2|玉米|35 2|大米|30 3|电脑|5 3|MP3|121 3|打印机|8; $strArray=...
主要为大家详细介绍了java实现字符串排列组合问题,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
主要为大家详细介绍了JAVA实现abc字符串的排列组合,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
对1-9位字符串进行重新排序组成新的字符串 且不重复可在NewOrder中"//此处添加条件"处添加条件
设计一个程序,当输入一个字符串时,要求输出这个字符串的所有排列。 例如输入字符串 abc,要求输出由字母 a、b、c 所能排列出来的所有字符串 abc,acb,bac,bca,cab,cba。 方法:递归法 以字符串 abc 为例介绍...
C语言程序设计-对长度为8个字符的字符串,将8个字符按降序排列;例如:原来的字符串为CEAedcab,排序后输出为edcbaE
C语言程序设计-对长度为7个字符的字符串,除首、尾字符外,将其余5个字符按降序排列;例如:原来的字符串为CEAedca,排序后输出为CedcEAa;.c
考拉想知道自己的这些字符串排列顺序是否满足这两种排序方法,考拉要忙着吃树叶,所以需要你来帮忙验证。 输入描述: 输入第一行为字符串个数n(n ≤ 100) 接下来的n行,每行一个字符串,字符串长度均小于100,均由小写...
字符串排列变换(Alternative String Arrange) 字母异位词(Anagrams) 基于前缀树的自动补全(Autocomplete Using Trie) 条形码验证器(Barcode Validator) Boyer-Moore搜索算法(Boyer Moore Search) 字符串...
输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则输出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba 思路 这是典型的递归求解问题,递归算法有四个特性: 必须有可...
用c语言描述将两个字符串连在一起且按升序排列 #include #include #define P printf int n; char * x(char *p1,char *p2) { char temple,temple2; int i,j,k,e,d,f; /* char a[]={"aegikl"}; char b[]={...
NULL 博文链接:https://yangkai.iteye.com/blog/585854
Backtracking 求解迷宫以及字符串排列组合