Как рассчитать возможные подпоследовательности слов, соответствующие шаблону?
Предположим, у меня есть последовательность:
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