중복 문자 의 문자열 조합 을 고려 하지 않 습 니 다.

CSDN 사용자 Hackbuter 1 의 칼럼 에서http://blog.csdn.net/hackbuteer1/article/details/7462447.
      하 해도 의 을 배 우 는 동안 방법 은 이해 하기 쉽 지만 알고리즘 의 구체 적 인 실현 은 어렵 기 때문이다.그래서 인터넷 코드 를 참고 했다.또한 나중에 독자 들 이 사용 할 수 있 도록 씁쓸 하고 이해 하기 어 려 운 코드 에 주석 을 달 았 다.
      문자열 을 입력 하여 이 문자열 의 모든 조합 을 출력 합 니 다.예 를 들 어 'abc' 를 입력 하면 a, b, c, ab, ac, bc, abc 가 조합 되 어 있 습 니 다.
      이 문제 도 재 귀적 인 사고방식 으로 문자열 의 조합 을 구 할 수 있다.      n 길이 의 문자열 에서 m 문자 의 조합 을 구하 고 싶다 고 가정 합 니 다.우 리 는 먼저 문자열 의 첫 번 째 문 자 를 처음부터 스 캔 합 니 다.첫 번 째 문자 에 대해 우 리 는 두 가지 선택 이 있 습 니 다. 하 나 는 이 문 자 를 조합 에 넣 는 것 입 니 다. 그 다음 에 우 리 는 남 은 n - 1 문자 중에서 m - 1 문 자 를 선택해 야 합 니 다.이 문 자 를 조합 에 넣 지 않 고 나머지 n - 1 글자 중에서 m 문 자 를 선택해 야 합 니 다.이 두 가지 선택 은 모두 재 귀적 으로 실현 하기 쉽다.다음은 이런 사고방식 의 참고 코드 입 니 다.
#include
#include
#include
using namespace std;
#include
void Combination(char *string ,int number,vector &result);//    string ,  number       ,          vector 
void Combination(char *string)
{
	assert(string != NULL);
	vector result;
	int i , length = strlen(string);
	for(i = 1 ; i <= length ; ++i)
		Combination(string , i ,result);//    string  1-length       
}

void Combination(char *string ,int number , vector &result)
{
	assert(string != NULL);
	if(number == 0)
	{//        number+1           (   n    number-1   )
		static int num = 1;
		printf(" %d   \t",num++);

		vector::iterator iter = result.begin();
		for( ; iter != result.end() ; ++iter)
			printf("%c",*iter);
		printf("
"); return ; } if(*string == '\0') return ; result.push_back(*string); Combination(string + 1 , number - 1 , result);//string+1 1, string[n-1] m-1 result.pop_back(); Combination(string + 1 , number , result);//string+1 1, string[n-1] m } int main(void) { char str[] = "abc"; Combination(str); return 0; }

좋은 웹페이지 즐겨찾기