Двигайте указатель по pattern только при совпадении с текущим символом text. Если удалось пройти весь pattern, это подпоследовательность.
Проверка наличия подпоследовательности в строке
Двигайте указатель по pattern только при совпадении с текущим символом text. Если удалось пройти весь pattern, это подпоследовательность.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Необходимо реализовать функцию, которая определяет, встречаются ли символы одной строки в другой в том же порядке, но не обязаны быть смежными.
function isSubsequence(pattern, text) {
return false;
}
// Примеры использования:
isSubsequence('whe', 'cartwheel') // true
isSubsequence('crt', 'cartwheel') // true
isSubsequence('ctr', 'cartwheel') // false
isSubsequence('weee', 'cartwheel') // false
Ответ
Двигайте указатель по pattern только при совпадении с текущим символом text. Если удалось пройти весь pattern, это подпоследовательность.
function isSubsequence(pattern, text) {
const expected = [...pattern];
let index = 0;
for (const char of text) {
if (index < expected.length && char === expected[index]) index++;
}
return index === expected.length;
}
Пустой pattern всегда подходит. Символы могут иметь промежутки, но их относительный порядок менять нельзя: ctr не встречается в cartwheel как подпоследовательность. Работа ведётся по Unicode-кодовым точкам с учётом регистра. Время O(|pattern| + |text|), память O(|pattern|).