Как рассчитать возможные подпоследовательности слов, соответствующие шаблону?

Предположим, у меня есть последовательность:

    Seq = 'hello my name'

и строка:

    Str = 'hello hello my friend, my awesome name is John, oh my god!'

И затем я ищу совпадения для моей последовательности в строке, поэтому я получаю индекс "слова" каждого совпадения для каждого слова последовательности в массиве ячеек, поэтому первый элемент - это ячейка, содержащая совпадения для "привет", второй элемент содержит совпадения для "my" и третий для "name".

    Match = {[1 2];      %'hello' matches
             [3 5 11];   %'my' matches
             [7]}        %'name' matches

Мне нужен код, чтобы как-то получить ответ о том, что возможные совпадения подпоследовательности:

    Answer = [1 3 7;     %[hello my name]
              1 5 7;     %[hello my name]
              2 3 7;     %[hello my name]
              2 5 7;]    %[hello my name]

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

ПРИМЕЧАНИЕ. Длина и количество совпадений "Seq" могут отличаться.

1 ответ

Решение

Поскольку длина Matches может отличаться, вам нужно использовать разделенные запятыми списки, вместе с ndgrid генерировать все комбинации (подход аналогичен тому, который использовался в этом другом ответе). Затем отфильтруйте комбинации, где индексы не увеличиваются, используя diff и логическая индексация:

cc = cell(1,numel(Match)); %// pre-shape to be used for ndgrid output
[cc{end:-1:1}] = ndgrid(Match{end:-1:1}); %// output is a comma-separated list
cc = cellfun(@(v) v(:), cc, 'uni', 0) %// linearize each cell
combs = [cc{:}]; %// concatenate into a matrix
ind = all(diff(combs.')>0); %'// index of wanted combinations
combs = combs(ind,:); %// remove unwanted combinations

Желаемый результат находится в переменной combs, В вашем примере

combs =
     1     3     7
     1     5     7
     2     3     7
     2     5     7
Другие вопросы по тегам