План курса / Все задачи / Алгоритмы и структуры данных
Подсчет пар индексов
средне
# решено
Дана строка s. Требуется найти количество пар индексов (i, j) таких, что 0 ≤ i ≤ j < len(s) и все символы в подстроке s[i..j] (включительно) различны, то есть в этой подстроке нет повторяющихся символов.
Пример 1:
Ввод: s = "a"
Вывод: 1
Пример 2:
Ввод: s = "aba"
Вывод: 5
Объяснение: Всего можно составить 5 пар, так чтобы символы были различны "a","ab","b","ba","a".
Пример 3:
Ввод: s = "baab"
Вывод: 6
Ограничения:
0 ≤ i ≤ j < len(s)
len(s) >= 1
public class Solution {
public static int CountingPairs(string s) {
int cnt = 0;
HashSet<char> window = new HashSet<char>();
int l = 0, r = -1;
while (l < s.Length) {
// наращиваем окно до тех пор, пока оно не будет содержать только неповторяющиеся символы
while (r + 1 < s.Length && !window.Contains(s[r + 1])) {
window.Add(s[r + 1]);
r++;
}
// обновляем счетчик количества пар в окне
cnt += r - l + 1;
// сжимаем окно, пока оно не будет содержать только неповторяющиеся символы
window.Remove(s[l]);
l++;
}
return cnt;
}
}
#include <string>
#include <unordered_set>
using namespace std;
int countingPairs(string& s) {
int cnt = 0;
unordered_set<char> window;
int l = 0, r = -1;
while (l < s.length()) {
// наращиваем окно до тех пор, пока оно не будет содержать только неповторяющиеся символы
while (r + 1 < s.length() && window.find(s[r + 1]) == window.end()) {
window.insert(s[r + 1]);
r++;
}
// обновляем счетчик количества пар в окне
cnt += r - l + 1;
// сжимаем окно, пока оно не будет содержать только неповторяющиеся символы
window.erase(s[l]);
l++;
}
return cnt;
}
package main
func countingPairs(s string) int {
cnt := 0
window := make(map[byte]bool)
l, r := 0, -1
for l < len(s) {
// наращиваем окно до тех пор, пока оно не будет содержать только неповторяющиеся символы
for r+1 < len(s) && !window[s[r+1]] {
window[s[r+1]] = true
r++
}
// обновляем счетчик количества пар в окне
cnt += r - l + 1
// сжимаем окно, пока оно не будет содержать только неповторяющиеся символы
delete(window, s[l])
l++
}
return cnt
}
import java.util.*;
public class Solution {
public static int countingPairs(String s) {
int cnt = 0;
Set<Character> window = new HashSet<>();
int l = 0, r = -1;
while (l < s.length()) {
// наращиваем окно до тех пор, пока оно не будет содержать только неповторяющиеся символы
while (r + 1 < s.length() && !window.contains(s.charAt(r + 1))) {
window.add(s.charAt(r + 1));
r++;
}
// обновляем счетчик количества пар в окне
cnt += r - l + 1;
// сжимаем окно, пока оно не будет содержать только неповторяющиеся символы
window.remove(s.charAt(l));
l++;
}
return cnt;
}
}
import java.util.*;
public class Solution {
public static int countingPairs(String s) {
int cnt = 0;
Set<Character> window = new HashSet<>();
int l = 0, r = -1;
while (l < s.length()) {
// наращиваем окно до тех пор, пока оно не будет содержать только неповторяющиеся символы
while (r + 1 < s.length() && !window.contains(s.charAt(r + 1))) {
window.add(s.charAt(r + 1));
r++;
}
// обновляем счетчик количества пар в окне
cnt += r - l + 1;
// сжимаем окно, пока оно не будет содержать только неповторяющиеся символы
window.remove(s.charAt(l));
l++;
}
return cnt;
}
}
from typing import *
def counting_pairs(s: str) -> int:
cnt = 0
window = set()
l, r = 0, -1
while l < len(s):
# наращиваем окно до тех пор, пока оно не будет содержать только неповторяющиеся символы
while r+1 < len(s) and s[r+1] not in window:
window.add(s[r+1])
r += 1
# обновляем счетчик количества пар в окне
cnt += r - l + 1
# сжимаем окно, пока оно не будет содержать только неповторяющиеся символы
window.remove(s[l])
l += 1
return cnt
Оценка сложности
Время: O(n), где n - длина s
Память: O(Alphabet), где Alphabet - размер алфавита