2015-01-21 2 views
-2

Проблемы: Учитывая строкух, сортировки, а затем печатать все комбинации. (найти на сайте кодирования, такие как hackerrank/interviewbit/geeksforgeeks)Печать всех комбинаций струнного C++ `

Вот пример ...

Входной сигнал: строка х = "БАК"

Выход: [ABC, АВ, АС, ВС, А, в, с]

Текущий рабочий раствор: (работает только для случая, когда x.length() = 3)

void printCombinations(string q){ 
    stack<char> c; 
    stack<char> c2; 
    sort(q.begin(), q.end()); 
    for(int i = 0; i<q.size(); i++){ 
     cout<<q[i]; 
     c.push(q[i]); 
    } 
    cout<<endl; 

    for(int i = 0; i<q.size(); i++){ 
     char t = c.top(); 
     cout<<t<<endl; 
     for(int j=0; j<c.size(); j++){ 
     c.pop(); 
     c2.push(c.top()); 
     cout<< t << c.top() <<endl; 
     } 
     c.pop(); 
     c = c2; 
    } 
} 
+0

Что вы берете для переполнения стека? Служба написания кода? Домашнее обслуживание? Переполнение стека *** ничего из этого не происходит. Пожалуйста, * пожалуйста * просмотрите [спросить], поскольку я уверен, что ваш вопрос будет закрыт (правильно). – cybermonkey

+0

Если вы берете на себя внимание и редактируете код своего комментария в свой вопрос, пожалуйста, уделите время, чтобы * удалить * весь комментарий, а не просто отредактировать код из него. – cybermonkey

+0

Спасибо Cybermonkey. Это не вопрос домашней работы. Я не прошу услуги написания кода. Я ищу более оптимальное решение. – 09182746

ответ

0
void printCombinations(string q){ 
    cout<<"We are now printing out all the combinations of "<<q<<endl; 
    sort(q.begin(), q.end()); 
    bitset<10> b; 
    int count =0; 
    for(int i=0; i<pow(2,q.size()); ++i){ 
     for(int x=0;x<10;x++){ 
      if(b[x] == 1){ 
       cout<<q[x]; 
      } 
     } 
     count++; 
     cout<<endl; 
     for(int j=0; j<10;j++){ 
      if(b[j]==1){ 
       b[j].flip(); 
      } 
      else{ 
       b[j].flip(); 
       break; 
      } 
     } 
    } 
    cout<<"There are "<<count<<" combinations"<<endl; 
} 

Вот одно решение поставленной выше задачи.

2

Я не уверен, почему код, отправленный в вашем вопросе, работает только с трехсимвольными строками, но, тем не менее, есть несколько проблем с ним (например, вам не нужно обращаться к стеку).

Это может быть решена путем преобразования string в массив char и итерации. код похож на то, что вы после того, как можно найти here и та же страница также дает имя решения (backtracking) и миленький схема, поясняющая, как это работает, используя строку ABC в качестве примера:

http://www.geeksforgeeks.org/wp-content/uploads/NewPermutation.gif

Этот код, однако, не делать то, что вы хотите «из коробки», но тем не менее с небольшой модификацией коды он делает:

код имеет небольшую ошибку где-то в нем, что делает вывод странных символов с результат, но однако делает prin все комбинации. Заглядывая в это и обновляя код, когда у меня есть решение.

void swap(char *x, char *y) 
{ 
    char temp; 
    temp = *x; 
    *x = *y; 
    *y = temp; 
} 


void permute(char *a, int i, int n) 
{ 
    int j; 
    if (i == n) 
     std::cout << string(a); 
    else 
    { 
     for (j = i; j <= n; j++) 
     { 
      swap((a + i), (a + j)); 
      permute(a, i + 1, n); 
      swap((a + i), (a + j)); //backtrack 
     } 
    } 
} 

int main() 
{ 
    char a[] = "BAC"; 
    int len = sizeof(a)/sizeof(a[0]); 
    permute(a, 0, len); 
    getchar(); 
    return 0; 
} 
+0

Да, я видел этот код. Это хорошо, потому что это дает нам все перестановки. Но вот точная точка, в которой я испытываю трудности. Как изменить код, чтобы он делал то, что я хочу. – 09182746

+1

Возможно, SO * - это служба написания кода в конце концов. ;) – paqogomez

+0

@DMPynes [Автоответчик] (http://stackoverflow.com/help/self-answer) - это совершенно правильный способ ответить на вопрос. Обязательно отметьте это как ответ. Я также думаю, что создание вопроса, который отлично объясняет проблему, быстрее подходит к оптимизированному ответу. – paqogomez

Смежные вопросы