Есть ли эффективный алгоритм для подсчета общего количества вхождений подстроки X
в более длинную строку Y
?подсчет вхождения подстрок
Чтобы быть более конкретным, что я хочу есть, общее количество способов выбора a.size() элементов из В, что существует перестановка выбранных элементов, что матчи B.
Примером может служить следующим образом: найдите общее число находок X=AB
в строке Y=ABCDBFGHIJ
?
Ответ 2: первый А и второй В, и первый А и 5-й Б.
Я знаю, что мы можем создать все перестановки длинной строки (которая будет N!
длина строки N
Y
) и используйте алгоритм KMP для поиска/подсчета вхождения X
в Y
.
Можем ли мы сделать это лучше?
Исходная проблема, которую я пытаюсь решить, заключается в следующем: допустим, у нас есть большая матрица M размера r на c (r и c в диапазоне 10000). Учитывая малую матрицу P размера a на b (a и b находятся в диапазоне 10). Найдите общее количество различных выборок строк и b столбцов M (это даст нам подмногочку «a» b »), так что существует перестановка строк и столбцов матрицы H, которая дает нам матрицу, которая соответствует P .
Я думаю, что как только я смогу решить одномерный случай, 2-D может следовать за решением.
После исследования выясняется, что это проблема изоморфизма подграфа и NP-сложная. Некоторые алгоритмы эффективно решают эту задачу. Можно это сделать и посмотреть на это много статей.
Очевидный первый шаг: удалить все символы из Y, которые не находятся в X. В вашем примере вы должны изменить Y на 'ABB'. Оттуда это не похоже на счет. –
Это не совсем «подстрока», которая обычно считается последовательной последовательностью ... более похожей на «упорядоченное подмножество» или что-то еще ... – twalberg
Согласен с @twalberg. Если вы можете уточнить, что _exactly_ вы имеете в виду подстрокой, это позволило бы ответить на вопрос. Итак, верно ли тогда, что ваше определение подстроки (_s_) заключается в том, что если X = AB, то подстроки являются «A», «B» и «AB»? – ryyker