2012-12-27 4 views
1

문자열 문제의 모든 순열에 대해 연구하고 있습니다. 현재 문자열을 나타 내기 위해 char 목록을 사용하고 있습니다. 문자 목록의 목록은 모든 가능한 순열을 나타냅니다.문자열 구현의 순열에 대한 문제

알고리즘은 매우 간단합니다. 길이가 n 인 각 문자열에 대해 첫 번째 문자를 잘라 내고 n-l 문자열의 모든 순열을 찾아야합니다. 그런 다음 작은 문자열의 모든 위치에 첫 번째 문자를 삽입합니다. 나를 위해 런타임 예외가 발생하는 첫 번째 문자를 삽입하고 어디서 알아낼 수가 없어.

하여 Main.cpp

#include <vector> 
#include <list> 

using namespace std; 

int main (void){ 

    list<char> s; 

    s.push_back('f'); 
    s.push_back('c'); 
    s.push_back('g'); 

    list<list<char> > mylist; 
    list<char>::iterator vit; 
    list<char> myvector; 
    mylist = perm(s,mylist); 


    for(list<list<char> >::iterator it = mylist.begin(); it != mylist.end(); ++it){ 
     myvector = *it; 
     for(vit = myvector.begin(); vit != myvector.end(); ++vit){ 
      cout << *vit << " "; 
     } 
     cout << "\n" << endl; 
    } 

    getchar(); 
    return 0; 
} 

구현 :

list<list <char> > perm(list<char> s, list<list<char> > mylist){ 
    int n = s.size(); 

    if(n == 1){ 
     mylist.push_back(s); 
     return mylist; 

    } 

    else{ 
     list<char>::iterator vit = s.begin(); 
     char first = *vit; 
     s.erase(vit);   

     list<list<char> > listB = perm(s,mylist); 

     for(list<list<char> >::iterator it = listB.begin(); it != listB.end(); ++it){ 
      list<char> myvector = *it; 
      for(list<char>::iterator vit2 = myvector.begin(); vit != myvector.end(); ++vit){ 
       cout << *vit2 << endl; 
       vit2 = myvector.insert(vit2,first); 
       cout << *vit2 << endl; 
       mylist.push_back(myvector); 
       myvector.erase(vit2); 
      } 
     } 

     return mylist; 
    } 

} 

출력 :

   g 
       c 
       c 
       f 
       f 

이어서 런타임 예외.

+0

사용중인 반복기를 확인하십시오. 내부 for 루프 조건에서 vit2와 vit을 모두 사용합니다. –

+0

(1)'vit'는's'를 가리 킵니다. 그러나 내부 루프의'myvector.end()'와 비교해보십시오. (2)'myvector'에서'vit2'를 지우고 무효화 한 다음 유효하지 않은'vit2'를 사용하여 요소를 삽입하십시오. –

답변

3

TL; DR은

그냥 std::next_permutation를 사용합니다.

관련 문제