Как получить все комбинации подпоследовательности Строки (в Java или C++ и т.д.)

Из Вашего ответа:

$("a[0]") 

не допустимый селектор. получить первое на использовании страницы:

$("a:first") 

или

$("a").eq(0). 

Так для селектора в Вашем ответе:

$("table[1]/tr[1]/td[1]/a").trigger('click'); 

запись

$("table").eq(1).children("tr").eq(1).children('td').eq(1).children('a').click();

Примечание, как это нажмет на все ссылки во второй ячейке таблицы второй строки таблицы во второй таблице на Вашей странице.
при использовании этого метода для перенаправления страницы к href следующий метод немного более хорош:

document.location = $("table").eq(1).children("tr").eq(1).children('td').eq(1).children('a').attr('href');

Примечание, как это установит местоположение документа на href первого найденный во второй ячейке таблицы второй строки таблицы, найденной во второй таблице на странице.
, Если Вы хотите соответствовать первому использованию элементов eq (0) вместо eq (1).

РЕДАКТИРОВАНИЕ
, Если Вы действительно хотите сделать это 1337-haxxor

$("table:eq(1) > tr:eq(1) > td:eq(1) > a").click();

однако, я думаю, что другой метод является большим количеством readible.

РЕДАКТИРОВАНИЕ

Хорошо, от Вас затем отвечают/подвергают сомнению на штуку
Как насчет того, чтобы не на самом деле нажать на ссылку, но просто установить строку document.location на него:

document.location = $("table").eq(0).children("tr").eq(0).children('td').eq(0).children('a').eq(0).attr('href');
19
задан hughdbrown 26 October 2009 в 15:15
поделиться

7 ответов

Вам нужен powerset. Вот все вопросы по StackOverflow, в которых упоминаются наборы мощности или наборы мощности .

Вот базовая реализация на python:

def powerset(s):
    n = len(s)
    masks = [1<<j for j in xrange(n)]
    for i in xrange(2**n):
        yield [s[j] for j in range(n) if (masks[j] & i)]


if __name__ == '__main__':
    for elem in powerset([1,2,3,4,5]):
        print elem

И вот его результат:

[]
[1]
[2]
[1, 2]
[3]
[1, 3]
[2, 3]
[1, 2, 3]
[4]
[1, 4]
[2, 4]
[1, 2, 4]
[3, 4]
[1, 3, 4]
[2, 3, 4]
[1, 2, 3, 4]
[5]
[1, 5]
[2, 5]
[1, 2, 5]
[3, 5]
[1, 3, 5]
[2, 3, 5]
[1, 2, 3, 5]
[4, 5]
[1, 4, 5]
[2, 4, 5]
[1, 2, 4, 5]
[3, 4, 5]
[1, 3, 4, 5]
[2, 3, 4, 5]
[1, 2, 3, 4, 5]

Примечание что его первый результат - пустой набор. Измените итерацию с этого для i в xrange (2 ** n): на это для i в xrange (1, 2 ** n): , если вы хотите пропустить пустой set.

Вот код, адаптированный для вывода строки:

def powerset(s):
    n = len(s)
    masks = [1<<j for j in xrange(n)]
    for i in xrange(2**n):
        yield "".join([str(s[j]) for j in range(n) if (masks[j] & i)])

Edit 2009-10-24

Хорошо, я вижу, вы неравнодушны к реализации на Java. Я не знаю Java, поэтому пойду на полпути и дам код на C #:

    static public IEnumerable<IList<T>> powerset<T>(IList<T> s)
    {
        int n = s.Count;
        int[] masks = new int[n];
        for (int i = 0; i < n; i++)
            masks[i] = (1 << i);
        for (int i = 0; i < (1 << n); i++)
        {
            List<T> newList = new List<T>(n);
            for (int j = 0; j < n; j++)
                if ((masks[j] & i) != 0)
                    newList.Add(s[j]);
            yield return newList;
        }
    }
31
ответ дан 30 November 2019 в 01:57
поделиться

В C ++ задана следующая процедура:

template <typename Iterator>
bool next_combination(const Iterator first, Iterator k, const Iterator last)
{
   /* Credits: Mark Nelson http://marknelson.us */
   if ((first == last) || (first == k) || (last == k))
      return false;
   Iterator i1 = first;
   Iterator i2 = last;
   ++i1;
   if (last == i1)
      return false;
   i1 = last;
   --i1;
   i1 = k;
   --i2;
   while (first != i1)
   {
      if (*--i1 < *i2)
      {
         Iterator j = k;
         while (!(*i1 < *j)) ++j;
         std::iter_swap(i1,j);
         ++i1;
         ++j;
         i2 = k;
         std::rotate(i1,j,last);
         while (last != j)
         {
            ++j;
            ++i2;
         }
         std::rotate(k,i2,last);
         return true;
      }
   }
   std::rotate(first,k,last);
   return false;
}

Затем вы можете выполнить следующее:

std::string s = "12345";
for(std::size_t i = 1; i <= s.size(); ++i)
{
   do
   {
      std::cout << std::string(s.begin(),s.begin() + i) << std::endl;
   }
   while(next_combination(s.begin(),s.begin() + i,s.end()));
}
10
ответ дан 30 November 2019 в 01:57
поделиться

Простейший алгоритм создания подмножеств набора размера N состоит в том, чтобы рассматривать все двоичные числа с использованием N битов. Каждая позиция в номере представляет собой элемент из набора. Если бит в числе равен 1, соответствующий элемент набора находится в подмножестве, в противном случае этот элемент не входит в подмножество. Поскольку биты в числе упорядочены, это сохраняет порядок исходного набора.

Ссылки:

  1. « Эффективное перечисление подмножеств набора »; Loughry, Hemert and Schoofs
  2. « Создание подмножеств »; Репозиторий алгоритмов Stony Brook
11
ответ дан 30 November 2019 в 01:57
поделиться

используя python, модуль itertools определяет метод комбинаций (), который делает именно то, что вам нужно.

from itertools import *
list(combinations( '12345', 2 ))

даст вам:

[('1', '2'), ('1', '3'), ('1', '4'), ('1', '5'), ('2', '3'), ('2', '4'), ('2', '5'), ('3', '4'), ('3', '5'), ('4', '5')]
8
ответ дан 30 November 2019 в 01:57
поделиться

Для этого вы можете использовать следующий класс (в Java):

class Combinations {

  String input;
  StringBuilder cur;

  private void next(int pos, int reminder) {
    cur.append(input.charAt(pos));

    if (reminder == 1) {
      System.out.println(cur);
    } else {
      for (int i = pos + 1; i + reminder - 1 <= input.length(); i++)
        next(i, reminder - 1);
    }
    cur.deleteCharAt(cur.length() - 1);
  }

  public void generate(String input) {
    cur = new StringBuilder();
    this.input = input;
    for (int length = 1; length <= input.length(); length++)
      for (int pos = 0; pos + length <= input.length(); pos++)
        next(pos, length);
  }
}

Для запуска вашего примера используйте следующий код:

new Combinations().generate("12345");

Порядок вывода такой же, как в примере. Не требуется хранить все подмножества, а затем сортировать их для получения описанного вами порядка.

3
ответ дан 30 November 2019 в 01:57
поделиться

Адриан Плиссон s answer показывает, как в Python извлекаются все подпоследовательности указанной длины (для произвольных типов данных последовательности). OP указывает, что он работает со строками и хочет всех подпоследовательностей. Таким образом, используя itertools.combinations , мы определяем:

>>> from itertools import combinations
>>> def subseq_combos(inp):
...     return (''.join(s) for r in range(len(inp) + 1) for s in combinations(inp, r))
... 
>>> list(subseq_combos('12345'))
['', '1', '2', '3', '4', '5', '12', '13', '14', '15', '23', '24', '25', '34', '35', '45', '123', '124', '125', '134', '135', '145', '234', '235', '245', '345', '1234', '1235', '1245', '1345', '2345', '12345']

(Если пустая подпоследовательность должна быть опущена, используйте range (1, len (inp) + 1)) .)

0
ответ дан 30 November 2019 в 01:57
поделиться

Когда вы разветвляете процесс, вы в основном получаете две (почти) точные копии процесса, и обе они продолжат работу.

Итак, что происходит. заключается в том, что сами дочерние элементы продолжают цикл в собственном пространстве процесса (после того, как они распечатывают свой вывод) , а также , как и родительский процесс. И, фактически, поскольку эти дети тоже разветвляются, внуки также будут продолжать жить с этого момента. Я уверен, что есть формула для определения того, сколько детей у вас в итоге будет (вероятно, что-то вроде N!), Но в данный момент у меня нет сил, чтобы это выяснить. Лучше использовать следующее решение.

Способ отличить родительский от дочернего - это возвращаемое значение из fork .

  • Если вы получите -1, вы '
0
ответ дан 30 November 2019 в 01:57
поделиться