2008-09-04 5 views

답변

0
def subsets(s): 
    r = [] 
    a = [False] * len(s) 
    while True: 
     r.append("".join([s[i] for i in range(len(s)) if a[i]])) 
     j = 0 
     while a[j]: 
      a[j] = False 
      j += 1 
      if j >= len(s): 
       return r 
     a[j] = True 

print subsets("abc") 
0

용서는 의사 코드는 ...

int i = 0; 
Results.push({}); 

While(i > Inset.Length) { 
    Foreach(Set s in Results) { 
    If(s.Length == i) { 
     Foreach(character c in inSet) 
      Results.push(s+c); 
    } 
    i++; 
} 
2

재귀 적 접근 - "ABC"의 하위 집합이 두 가지 유형에 와서 : "BC"의 부분 집합 인 것들, 그리고있는 그 "a"와 "bc"의 하위 집합. 따라서 "bc"의 하위 집합을 알고 있다면 쉽습니다.

또는 길이가 n 인 문자열에는 2^n 개의 하위 집합이 있습니다. 그래서 두 개의 중첩 된 루프를 작성합니다. i는 0에서 2^n-1 (부분 집합의 경우)을 계산하고 j는 0부터 n-1까지 (i 번째 하위 집합의 문자의 경우) 계산합니다. 문자열의 j 번째 문자와 나는의 j 번째 비트 인 경우에만 1

(글쎄, 당신은 주관적 "최고"라고 말 했는가 ...) 경우 출력

1

은 이진 표현에 숫자를 해석 부분 집합에 포함 된 요소를 나타냅니다. 세트에 3 가지 요소가 있다고 가정 해 봅시다. 숫자 4는 이진 표기법에서 0100에 해당하므로이 값을 두 번째 요소 만 포함하는 크기 1의 하위 집합으로 해석합니다. 이 방법은 모든 서브 세트를 생성하는 단계 (2^N) -1

char str [] = "abc"; 
    int n = strlen(str); // n is number of elements in your set 

    for(int i=0; i< (1 << n); i++) { // (1 << n) is equal to 2^n 
     for(int j=0; j<n; j++) { // For each element in the set 
      if((i & (1 << j)) > 0) { // Check if it's included in this subset. (1 << j) sets the jth bit 
       cout << str[j]; 
      } 
     } 
     cout << endl; 
    } 
0
//recursive solution in C++ 
set<string> power_set_recursive(string input_str) 
{ 
    set<string> res; 
    if(input_str.size()==0) { 
     res.insert(""); 
    } else if(input_str.size()==1) { 
     res.insert(input_str.substr(0,1)); 
    } else { 
     for(int i=0;i<input_str.size();i++) { 
      set<string> left_set=power_set_iterative(input_str.substr(0,i)); 
      set<string> right_set=power_set_iterative(input_str.substr(i,input_str.size()-i)); 
      for(set<string>::iterator it1=left_set.begin();it1!=left_set.end();it1++) { 
       for(set<string>::iterator it2=right_set.begin();it2!=right_set.end();it2++) { 
        string tmp=(*it1)+(*it2); 
        sort(tmp.begin(),tmp.end()); 
        res.insert(tmp); 
       } 
      } 
     } 
    } 
    return res; 
} 


//iterative solution in C++ 
set<string> power_set_iterative(string input_str) 
{ 
    set<string> res; 
    set<string> out_res; 
    res.insert(""); 
    set<string>::iterator res_it; 
    for(int i=0;i<input_str.size();i++){ 
     for(res_it=res.begin();res_it!=res.end();res_it++){ 
       string tmp=*res_it+input_str.substr(i,1); 
       sort(tmp.begin(),tmp.end()); 
       out_res.insert(tmp); 
     } 
     res.insert(input_str.substr(i,1)); 
     for(set<string>::iterator res_it2=out_res.begin();res_it2!=out_res.end();res_it2++){ 
      res.insert(*res_it2); 
    } 
    out_res.clear(); 
    } 
    return res; 
} 
까지 세고
관련 문제