60.把给定一个字符串的所有组合打印出来,例如给定 abc,打印abc acb bac bca cab cba.
#include<iostream>
#include<string>
using namespace std;
int N = 4;
void stringC(char* in,int n)
{
if (n==0)
{
for (int i = 0; i < N; i++)
{
cout << in[i];
}
cout << endl;
}
for (int i = N - n; i < N; i++)
{
char* inTemp=new char[N]; //有点占内存,嘿嘿 把abc拷贝传进下次递归 下一次再交换位置变成acb输出 再到第一层交换成bac 再去第二层交换 依次类推
for (int j = 0; j < N; j++)
{
inTemp[j] = in[j];
}
if (i != N - n)
swap(inTemp[N - n], inTemp[i]);
stringC(inTemp, n - 1);
delete[] inTemp;
}
}
void main()
{
char a[4] = { 'a', 'b', 'c' ,'d'};
stringC(a, 4);
}
弄复杂了,其实交换之后再交换回来就不用不停地传进去了。。。
#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;
void checkInString(char* pc,char* pBegin)
{
if (*pBegin=='\0')
{
cout<<pc;
}
else
{
for (char* pch=pBegin;*pch!='\0';++pch)
{
char temp=*pch;
*pch=*pBegin;
*pBegin=temp;
checkInString(pc,pBegin+1);
temp=*pch;
*pch=*pBegin;
*pBegin=temp;
}
}
}
void main()
{
char in1[4]={'a','b','c','\0'};
checkInString(in1,in1);
}
问题:输入一个字符串(要求不存在重复字符),输出该字符串中字符的所有组合。
例如:如果输入abc,它的组合有a、b、c、ab、ac、bc、abc。
方法一:
思路:同样是用递归求解。可以考虑求长度为n的字符串中m个字符的组合,设为C(n,m)。原问题的解即为C(n, 1), C(n, 2),...C(n, n)的总和。对于求C(n, m),从第一个字符开始扫描,每个字符有两种情况,要么被选中,要么不被选中,如果被选中,递归求解C(n-1, m-1)。如果未被选中,递归求解C(n-1, m)。不管哪种方式,n的值都会减少,递归的终止条件n=0或m=0。
#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;
void allArray_m(char* pStr, int m, vector<char> &result) ;
void allArray(char* c)
{
if ( c==NULL || *c=='\0' )
return;
for ( int i = 1; i <= strlen(c); i++ )
{
vector<char> result;
allArray_m(c, i, result);
}
}
void allArray_m(char* pStr, int m, vector<char> &result)
{
//字符串为空,或者长度达不到m
if ( pStr==NULL || (*pStr=='\0'&&m!=0) )
return;
//出口,输出组合
if (m==0)
{
for ( unsigned i = 0; i < result.size(); i++ )
cout << result[i];
cout << endl;
return;
}
//如果长度没有达到m
//此时选择这个元素
result.push_back(*pStr);
allArray_m(pStr+1,m-1,result);
result.pop_back();
//此时并不选择这个元素
allArray_m(pStr+1,m,result);
}
void main()
{
char* a="ab";
allArray(a);
}