Sobes.tech
Intern

func countSubs(s string) int { result := 0 left := 0 hm := make(map[rune]int) for right := 0; right < len(s); right++ { hm[s[right]]++ for hm[s[right]] > 1 { hm[s[left]]-- if hm[s[left]] == 0 { delete(hm, s[left]) } left++ } result += (right - left + 1) } return result }

sobes.tech AI

AIdan javob

countSubs funksiyasi s satrida barcha belgilari noyob bo'lgan kichik satrlar sonini hisoblaydi.

Algoritm "siljish oynasi" usulidan foydalanadi, unda ikkita ko'rsatkich left va right mavjud. hm lug'ati hozirgi oynadagi har bir belgi uchun kirishlar sonini saqlaydi.

  • Oyna o'ngga kengaytirilganda, belgi hisoblagichi oshiriladi.
  • Agar belgi bir martadan ko'p bo'lsa, chap ko'rsatkich harakatlanadi va hisoblagichlar kamaytiriladi, takrorlanish yo'qolguncha.
  • right pozitsiyasida tugaydigan noyob kichik satrlar soni, hozirgi oynaning uzunligiga teng (right - left + 1).
  • Bu qiymat barcha pozitsiyalar uchun qo'shiladi.

Foydalanish misoli:

total := countSubs("abc") // total = 6, kichik satrlar: "a", "b", "c", "ab", "bc", "abc"

Shu tarzda, funksiya takrorlanmaydigan belgilarga ega bo'lgan kichik satrlar sonini samarali ravishda O(n) vaqt ichida hisoblaydi.