Сложность: medium
Дана строка
s, удалите повторяющиеся буквы так, чтобы каждая буква появилась один раз и только один раз. Вы должны сделать так, чтобы результат был наименьшим в лексикографическом порядке среди всех возможных результатов.Пример:
Input: s = "bcabc"
Output: "abc"
👨💻 Алгоритм:
1⃣Инициализация стека
Создайте стек, который будет хранить результат, построенный по мере итерации строки.
2⃣Итерация по строке
На каждой итерации добавляйте текущий символ в стек, если он еще не был использован. Перед добавлением текущего символа удаляйте как можно больше символов из вершины стека, если это возможно и улучшает лексикографический порядок.
3⃣Удаление символов
Удаляйте символы с вершины стека при выполнении следующих условий: Символ на вершине стека больше текущего символа. Символ может быть удален, так как он встречается позже в строке. На каждом этапе итерации по строке жадно минимизируйте содержимое стека.
😎 Решение:
class Solution {
removeDuplicateLetters(s) {
const stack = [];
const seen = new Set();
const lastOccurrence = {};
for (let i = 0; i < s.length; i++) {
lastOccurrence[s[i]] = i;
}
for (let i = 0; i < s.length; i++) {
const c = s[i];
if (!seen.has(c)) {
while (stack.length && c < stack[stack.length - 1] && i < lastOccurrence[stack[stack.length - 1]]) {
seen.delete(stack.pop());
}
seen.add(c);
stack.push(c);
}
}
return stack.join('');
}
}Ставь 👍 и забирай 📚 Базу знаний