मान लीजिए हमारे पास एक स्ट्रिंग s है, हमें s के सजातीय सबस्ट्रिंग की संख्या ढूंढनी है। उत्तर बहुत बड़ा हो सकता है, इसलिए उत्तर को 10^9+7 मॉड्यूलो वापस करें। एक स्ट्रिंग को सजातीय कहा जाता है जब स्ट्रिंग के सभी वर्ण समान हों।
उदाहरण के लिए, यदि इनपुट है s = "xyyzzzxx", तो आउटपुट 13 होगा क्योंकि सजातीय सबस्ट्रिंग हैं:
- "x" तीन बार आता है।
- "xx" एक बार आता है।
- "y" दो बार आता है।
- "yy" एक बार आता है।
- "z" तीन बार आता है।
- "zz" दो बार आता है।
- "zzz" एक बार आता है।
(3 + 1 + 2 + 1 + 3 + 2 + 1) = 13।
समाधान के चरण
s := s + "@"h :=एक नया मैपprev := s[0]c := 1sमें इंडेक्स 1 से अंत तक प्रत्येकiके लिए:- यदि
prev != i, तो:- यदि
prev*chमें मौजूद है, तोh[prev*c] := h[prev*c] + 1 - अन्यथा,
h[prev*c] := 1 c := 1
- यदि
- यदि
prev == i, तोc := c + 1 prev := i
- यदि
fin := 0hमें प्रत्येकiके लिए:t := len(i)k := 0while t != 0:k := k + tt := t - 1
fin := fin + k * h[i]
fin % 1000000007वापस करें
उदाहरण
बेहतर समझ के लिए निम्नलिखित कार्यान्वयन देखें:
def solve(s):
s += "@"
h = {}
prev = s[0]
c = 1
for i in s[1:]:
if prev != i:
if prev*c in h:
h[prev*c] += 1
else:
h[prev*c] = 1
c = 1
if prev == i:
c += 1
prev = i
fin = 0
for i in h:
t = len(i)
k = 0
while t != 0:
k += t
t -= 1
fin += k * h[i]
return fin % 1000000007
s = "xyyzzzxx"
print(solve(s))
इनपुट
"xyyzzzxx"
आउटपुट
13