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.
rightpozitsiyasida 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.