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

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

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

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

sobes.tech AI

Для решения задачи нужно посчитать количество подстрок строки, в которых все символы уникальны (нет повторяющихся символов).

Подход с использованием двух указателей (двух окон):

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

Пример на Go:

func countUniqueSubstrings(s string) int {
    count := 0
    charIndex := make(map[rune]int)
    start := 0
    runes := []rune(s)

    for end, ch := range runes {
        if prev, found := charIndex[ch]; found && prev >= start {
            start = prev + 1
        }
        charIndex[ch] = end
        count += end - start + 1
    }
    return count
}

// Пример использования:
// s := "aba"
// fmt.Println(countUniqueSubstrings(s)) // Выведет 5

Здесь мы считаем количество подстрок с уникальными символами, что соответствует количеству пар индексов i, j, где подстрока s[i..j] не содержит повторов.