Sobes.tech
Назад к вопросам
Intern
4

/* дана строка символов. Найти количество пар индексов i и j (i <= j), между которыми нет повторяющихся символов. Для строки "aba" ответ 5: [0, 0] ("a") [0, 1] ("ab") [1, 1] ("b") [1, 2] ("ba") [2, 2] ("a") */

Компании, где спрашивали
Яндекс

Ответ от нейросети

sobes.tech AI

Чтобы найти количество пар индексов (i, j), для которых подстрока s[i:j+1] не содержит повторяющихся символов, можно использовать метод "скользящего окна" (two pointers).

Идея:

  • Используем два указателя: start и end, которые будут обозначать текущий рассматриваемый интервал.
  • Расширяем end, пока символы уникальны.
  • Когда встречаем повтор, сдвигаем start, удаляя символы из множества.
  • Для каждого положения end считаем количество подстрок без повторов, которые заканчиваются в end.

Пример на Go:

func countUniqueSubstrings(s string) int {
    seen := make(map[rune]int)
    start := 0
    count := 0
    for end, ch := range s {
        if pos, ok := seen[ch]; ok && pos >= start {
            start = pos + 1
        }
        seen[ch] = end
        count += end - start + 1
    }
    return count
}

// Для "aba" функция вернет 5

Здесь count аккумулирует количество уникальных подстрок без повторяющихся символов.