Подсчёт подстрок без повторяющихся символов

Поддерживайте окно без повторов и последнюю позицию каждой буквы. Для правого конца right существует right - left + 1 подходящих подстрок; суммируйте эти количества.

Короткий ответ

Что ответить на собеседовании

Поддерживайте окно без повторов и последнюю позицию каждой буквы. Для правого конца right существует right - left + 1 подходящих подстрок; суммируйте эти количества.

Подробный разбор

Ответ с пояснениями

Условие

Дана строка, состоящая только из строчных латинских букв. Требуется определить количество её подстрок, в которых каждый символ встречается не более одного раза.

Примеры: aba → a, b, ab, ba, a → 5 abc → a, b, c, ab, bc, abc → 6

Ответ

Поддерживайте окно без повторов и последнюю позицию каждой буквы. Для правого конца right существует right - left + 1 подходящих подстрок; суммируйте эти количества.

public long countUniqueSubstrings(String s) {
    int[] last = new int[26];
    java.util.Arrays.fill(last, -1);
    int left = 0;
    long count = 0;
    for (int right = 0; right < s.length(); right++) {
        int c = s.charAt(right) - 'a';
        left = Math.max(left, last[c] + 1);
        count += right - left + 1;
        last[c] = right;
    }
    return count;
}

Вход соответствует условию: только a–z. Время O(n), память O(26). Считаются вхождения подстрок, не разные значения: обе буквы a в aba учитываются отдельно. Результаты — 5 и 6.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее