问题描述
/*
* 列出所有的子集
* 列如:输入:ABC
* 输出:ABC,AB,AC,BC,B,C,A,{}表示空集合
*
*/
思路:
解决上述问题可以用递归的思想,对于一个ABC字符串,要输出其所有的子集,那当选择第一个字符A时,有两种选择,一种选择,一种不选,此时剩下的问题就是在余下的BC中继续输出子集,这是一个相同形式的问题,但是规模变小了,由原先的3个字符的子集,变为了2个字符的问题,规模减小了,此时给用递归求解提供了必要的条件。
下面的代码
const char Token = '_';
static void printStr(char *ptr)
{
printf("{");
while(*ptr != '\0'){
if( *ptr != Token ){
printf("%c",*ptr);
}
ptr++;
}
printf("}\n");
}
static void RecursivePermute(char *str, int k)
{
if(strlen(str) == k){
//printf("%s\n",str);
printStr(str);
return;
}
RecursivePermute(str, k+1);
char tmp = str[k];
str[k] = Token;
RecursivePermute(str, k+1);
str[k] = tmp;
}
void ListSubsets(char *str)
{
RecursivePermute(str, 0);
}