Я ищу некоторые указатели для записи функции (назовем ее replaceGlobal
), которая берет входную строку и сопоставление подстрок с заменяющими значениями и применяет эти сопоставления, чтобы максимально возможное количество символов из строка ввода заменяется. Например:Глобальные оптимальные строковые подстановки
replaceGlobal("abcde", {
'a' -> 'w',
'abc' -> 'x',
'ab' -> 'y',
'cde' -> 'z'
})
вернется "yz"
путем применения 'ab' -> 'y'
и 'cde' -> 'z'
.
Функция будет применять только один раунд замещений, поэтому он не может заменить значение, а затем использовать часть замещающего значения как часть другой подстановки.
Жадный подход дает неоптимальные результаты (показанные здесь Javascript):
"abcde".replace(/(abc|cde|ab|a)/g, function(x) {
return {
'a': 'w',
'abc': 'x',
'ab': 'y',
'cde': 'z'
}[x];
});
возвращается 'xde'
Любые мысли о хорошей отправной точкой здесь?
Я думаю, что проблема сводится к нахождению путь с наименьшими затратами в весовом DAG, построенной с входной строки в позвоночнике и других краев, предусмотренных заменами:
/------x------------\
/-----y------\ \
/---w--\ \ \ /-------z------\
0 -----> a ----> b -----> c -----> d ----> e ----> $
, где края вдоль позвоночника имеют стоимость 1, но остальные края имеют нулевое значение.
Но это может быть слишком сложным.
Можете ли вы добавить правило для '' abcde '->' yz'' и т. Д.? –
@BrentWashburne Если я правильно вас понимаю, нет. Генерирование всех возможных перестановок замещений из исходного набора не является разумным. Просьба уточнить, не является ли это то, что вы предлагаете. –
Да, это то, что я предлагал. Как насчет того, чтобы сначала поставить ''cde' -> 'z''? –