输出字符串子集

问题描述

/*
 * 列出所有的子集
 * 列如:输入: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);
}


 

你可能感兴趣的:(递归)