ধরুন আমাদের একটি ছোট হাতের স্ট্রিং s আছে, আমাদের s-এর প্রতিটি সাবস্ট্রিং-এ স্বতন্ত্র অক্ষর গণনার যোগফল খুঁজে বের করতে হবে। যদি উত্তরটি খুব বড় হয় তবে ফলাফল মোড 10^9+7 ফেরত দিন।
সুতরাং, যদি ইনপুটটি s ="xxy" এর মত হয়, তাহলে আউটপুট হবে 6, সাবস্ট্রিং এবং তাদের সংখ্যা −
-
"x" :1
-
"x" :1
-
"y" :1
-
"xx" :0 (যেহেতু "x" আলাদা নয়)
-
"xy" :2
-
"xxy" :1 ("যেমন "x" আলাদা নয়)
এটি সমাধান করতে, আমরা এই পদক্ষেপগুলি অনুসরণ করব -
-
m :=10^9 + 7
-
prev_seen :=একটি নতুন খালি মানচিত্র
-
উত্তর :=0
-
একটি ফাংশন util() সংজ্ঞায়িত করুন। এটি i, প্রতীক
নেবে -
prev_seen[symbol] :=একক মান −1
সহ একটি তালিকা -
পূর্ববর্তী :=পূর্বের_দেখা [প্রতীক]
-
পূর্বের শেষে i সন্নিবেশ করান
-
যদি পূর্ববর্তী> 2 এর আকার, তাহলে
-
বাম :=পূর্বের প্রথম উপাদান এবং পূর্ববর্তী থেকে প্রথম উপাদান মুছে ফেলুন
-
মধ্যম :=পূর্ববর্তী[0], ডানে :=পূর্ববর্তী[1]
-
cnt :=(মধ্য - বাম) *(ডান - মধ্যম)
-
উত্তর :=(ans + cnt) mod m
-
-
প্রতিটি সূচক i এবং s-এ মান চিহ্নের জন্য, do
-
util(i, প্রতীক)
-
-
prev_seen-এ প্রতিটি প্রতীকের জন্য করুন
-
util(s এর আকার , প্রতীক)
-
-
উত্তর ফেরত দিন
আরো ভালোভাবে বোঝার জন্য আসুন নিচের বাস্তবায়ন দেখি -
উদাহরণ
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