ধরুন, আমাদের একটি স্ট্রিং 'i' আছে যা ছোট হাতের অক্ষর এবং আরেকটি পূর্ণসংখ্যা 'j' নিয়ে গঠিত। আমাদের খুঁজে বের করতে হবে কতগুলি স্ট্রিং আছে যেগুলি 'i'-এর আকারের সমান এবং অভিধানগতভাবে 'i'-এর সমান বা সমান এবং 'j'-এর থেকে বড় কোনো ধারাবাহিক সমান অক্ষর নেই।
উত্তরটি 10^9 + 7 দ্বারা মোডের ফলাফল খুঁজে বের করে গণনা করতে হবে।
সুতরাং, যদি ইনপুট হয় i ="app", j =2, তাহলে আউটপুট হবে 405।
এটি সমাধান করতে, আমরা এই পদক্ষেপগুলি অনুসরণ করব -
-
যদি j <=0, তাহলে
-
রিটার্ন 0
-
-
m :=10 ^ 9 + 7
-
n :=i
এর আকার -
সংখ্যা :=s
তে উপস্থিত প্রতিটি অক্ষরের জন্য একটি নতুন তালিকা (অক্ষরের ইউনিকোড উপস্থাপনা - "a" এর ইউনিকোড উপস্থাপনা) -
রিটার্ন dp(0, True, -1, 0) mod m
-
একটি ফাংশন dp() সংজ্ঞায়িত করুন। এটি pos, bound, last, count
লাগবে-
যদি গণনা> j অ-শূন্য হয়, তাহলে
-
রিটার্ন 0
-
-
যদি pos n এর মত হয়, তাহলে
-
রিটার্ন 1
-
-
সংখ্যা :=সংখ্যা[pos]
-
res :=0
-
0 থেকে (সংখ্যা + 1 যদি আবদ্ধ, অন্যথায় 26) রেঞ্জের জন্য, করুন
-
res :=res + dp(pos + 1, সত্য যদি আবদ্ধ হয় এবং i সংখ্যার সমান হয়, i, গণনা *(সত্য যদি আমি শেষের মতো হয়) + 1)
-
-
রিটার্ন রিটার্ন
-
-
মূল পদ্ধতি থেকে dp(0, True, -1, 0) % m
ফেরত দিন
উদাহরণ
আরো ভালোভাবে বোঝার জন্য আসুন নিচের বাস্তবায়ন দেখি -
class Solution: def solve(self, s, k): if k <= 0: return 0 MOD = 10 ** 9 + 7 n = len(s) nums = [ord(char) - ord("a") for char in s] def dp(pos, bound, last, count): if count > k: return 0 if pos == n: return 1 num = nums[pos] res = 0 for i in range(num + 1 if bound else 26): res += dp(pos + 1, bound and i == num, i, count * (i == last) + 1) return res return dp(0, True, -1, 0) % MOD ob = Solution() print(ob.solve('app',2))
ইনপুট
i = "app" j = 2
আউটপুট
405