मान लीजिए कि हमारे पास एक लोअरकेस स्ट्रिंग s है, हमें s के प्रत्येक विकल्प में अलग-अलग वर्णों की संख्या का योग ज्ञात करना है। अगर उत्तर बहुत बड़ा है तो परिणाम मोड 10^9+7 लौटाएं।
इसलिए, यदि इनपुट s ="xxy" जैसा है, तो आउटपुट 6 होगा, क्योंकि सबस्ट्रिंग और उनकी गणनाएँ हैं -
-
"एक्स" :1
-
"एक्स" :1
-
"वाई" :1
-
"xx" :0 (जैसा कि "x" अलग नहीं है)
-
"xy" :2
-
"xxy" :1 ("जैसा कि "x" अलग नहीं है)
इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -
-
मी :=10^9 + 7
-
prev_seen :=एक नया खाली नक्शा
-
उत्तर :=0
-
उपयोग() फ़ंक्शन को परिभाषित करें। यह मैं, प्रतीक लेगा
-
prev_seen[symbol] :=एकल मान वाली एक सूची −1
-
पिछला:=prev_seen[प्रतीक]
-
पिछले के अंत में i डालें
-
अगर पिछला का आकार> 2, तो
-
बायां:=पिछला का पहला तत्व और पिछला से पहला तत्व हटाएं
-
मध्य:=पिछला[0], दाएं:=पिछला[1]
-
cnt :=(मध्य - बाएँ) *(दाएँ - मध्य)
-
उत्तर:=(Ans + cnt) मॉड एम
-
-
प्रत्येक अनुक्रमणिका i और s में मान चिह्न के लिए, करें
-
उपयोग (i, प्रतीक)
-
-
prev_seen में प्रत्येक प्रतीक के लिए, करें
-
उपयोग (एस का आकार, प्रतीक)
-
-
वापसी उत्तर
आइए बेहतर समझ पाने के लिए निम्नलिखित कार्यान्वयन देखें -
उदाहरण
class Solution: def solve(self, s): m = 10 ** 9 + 7 prev_seen = {} ans = 0 def util(i, symbol): nonlocal ans prev = prev_seen.setdefault(symbol, [−1]) prev.append(i) if len(prev) > 2: left = prev.pop(0) middle, right = prev cnt = (middle − left) * (right − middle) ans = (ans + cnt) % m for i, symbol in enumerate(s): util(i, symbol) for symbol in prev_seen: util(len(s), symbol) return ans ob = Solution() s = "xxy" print(ob.solve(s))
इनपुट
xxy
आउटपुट
6