문자열 의 조합

질문:
문자열 을 입력 하여 이 문자열 의 모든 조합 을 출력 합 니 다.예 를 들 어 abc 를 입력 하면 a, b, c, ab, ac, bc, abc 가 조합 되 어 있 습 니 다.
분석:
예전 에 비슷 한 문 제 를 풀 었 고 문자열 의 모든 배열 을 풀 었 으 며 재 귀적 인 사 고 를 사용 했다.
바 이 너 리 방법
이 문제 에서 제 가 생각 한 첫 번 째 방식 은 2 ^ n 의 특수성 을 고려 한 것 입 니 다. 만약 에 문자열 의 길이 가 5 라면 우 리 는 2 ^ 5 의 조합 방식 이 있 을 수 있 습 니 다. 이 진 으로 표시 하고 i 위 는 1 이 며 출력 string [i] 을 표시 합 니 다.0 이면 출력 하지 않 습 니 다.
알고리즘 은 다음 과 같 습 니 다.
재 귀 방법
배열 과 마찬가지 로 재 귀적 인 사고방식 으로 string 의 조합 을 계산 할 때 string [0] 이 결과 에 저장 되 었 는 지 여 부 를 고려 하여 두 번 재 귀 를 한다. 한 번 은 stirng [0] 을 포함 하고 다른 하 나 는 string [0] 을 포함 하지 않 는 다. 여기 서 우 리 는 하나의 창 고 를 사용 하여 결 과 를 저장 해 야 한다.스 택 의 상 태 를 유지 하 는 것 이 관건 입 니 다. 배열 과 유사 합 니 다.
알고리즘:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <math.h>
using namespace std;

int main()
{
	char *string = "abcdef";

	int len = strlen(string);
	if(len > 32)
		return -1;

	int number = (int)pow(2.0, len);
	for(int i = 0 ; i < number; i++)
	{
		for(int j = 0; j < len; j++)
		{
			if((i>>j) & 1)		//     1, 1   string    i 
				cout << string[j];
		}

		cout << endl;
	}

	return 0;
}

요약:
첫 번 째 는 바 이 너 리 방식 으로 정수 길이 의 제한 을 받 아 int 는 32 글자 만 표시 할 수 있다.두 번 째 방식 은 재 귀적 인 사고방식 으로 하나의 창 고 를 유지 하고 결 과 를 보존 하 는 데 사용 하 는데 이런 방식 은 비교적 직관 적 이 고 이해 하기 쉬 우 므 로 두 번 째 방법 을 추천 합 니 다.

좋은 웹페이지 즐겨찾기