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

Дана строка символов. Найти количество пар индексов i и j (i <= j), между которыми, включительно, нет повторяющихся символов. Для строки "aba" ответ 5: [0, 0] ("a") [0, 1] ("ab") [1, 1] ("b") [1, 2] ("ba") [2, 2] ("a") Для строки "abcb" ответ ?: aba 3 + 2 = 5 abcb 4(a, b, c, d) + 1(ab) + 1(bc) + 1(cb) + 1(abc) = 8

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

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

sobes.tech AI

Нужно найти количество пар индексов (i, j), где i ≤ j, таких что подстрока s[i..j] не содержит повторяющихся символов.

Для строки "abcb" рассмотрим все подстроки:

  • [0,0] = "a" — уникально
  • [0,1] = "ab" — уникально
  • [0,2] = "abc" — уникально
  • [0,3] = "abcb" — 'b' повторяется, не подходит
  • [1,1] = "b" — уникально
  • [1,2] = "bc" — уникально
  • [1,3] = "bcb" — 'b' повторяется, не подходит
  • [2,2] = "c" — уникально
  • [2,3] = "cb" — уникально
  • [3,3] = "b" — уникально

Всего уникальных подстрок без повторов: 8

Пример решения на Go с использованием двух указателей (sliding window):

func countUniqueSubstrings(s string) int {
    seen := make(map[byte]int)
    left := 0
    count := 0

    for right := 0; right < len(s); right++ {
        if pos, ok := seen[s[right]]; ok && pos >= left {
            left = pos + 1
        }
        seen[s[right]] = right
        count += right - left + 1
    }
    return count
}

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

Идея: расширяем правый указатель, если встречаем повтор — сдвигаем левый указатель, чтобы исключить повтор, и считаем количество уникальных подстрок, заканчивающихся в текущем правом индексе.