मान लीजिए कि हमारे पास दो तार s और t हैं, और दो मान p और q हैं। हमें यह जांचना होगा कि क्या s से t प्राप्त करना संभव है जैसे कि s को अंतिम समूह को छोड़कर वर्णों की p संख्या के समूहों में विभाजित किया गया है, जिसमें वर्ण p होंगे और हम प्रत्येक समूह से अधिक से अधिक q वर्णों को चुन सकते हैं, और t में वर्णों का क्रम भी s के समान होना चाहिए।
इसलिए, यदि इनपुट s ="mnonnopeqrst", t ="moprst", p =5, q =2 जैसा है, तो आउटपुट सही होगा क्योंकि हम "mnonn", "opeqr", "st" जैसे डिवीजन बना सकते हैं। , अब "mnonn" और "opeqr" से 2 कैरेक्टर सबस्ट्रिंग "mo" और "pr" लेकर फिर "st" पहले से मौजूद है इसलिए इन दो लेंथ सबस्ट्रिंग्स का उपयोग करके हम साधारण कॉन्सटेनेशन द्वारा t जेनरेट कर सकते हैं।
इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -
- अस्थायी:=एक खाली नक्शा जिसमें सभी चाबियों के लिए खाली सूची है
- l :=s की लंबाई के समान आकार की एक सूची और 0 से भरें
- i के लिए 0 से लेकर s के आकार तक के लिए, करें
- अस्थायी के अंत में i डालें['a']
- निम्न :=0
- i के लिए 0 से t-1 के आकार की सीमा में, do
- सूचकांक:=अस्थायी['ए']
- यह :=अनुक्रमित क्रम को बनाए रखने के लिए सूचकांक सूची में कम सम्मिलित करने के लिए सूचकांक
- यदि यह सूचकांक -1 के आकार के समान है, तो
- झूठी वापसी
- गिनती :=का भागफल (सूचकांक[it] / p)
- l[गिनती] :=l[गिनती] + 1
- यदि l[गिनती]>=q, तो
- गिनती :=गिनती + 1
- कम:=गिनती * पी
- अन्यथा,
- निम्न :=सूचकांक [यह] + 1
- सही लौटें
उदाहरण
आइए बेहतर समझ पाने के लिए निम्नलिखित कार्यान्वयन देखें -
from bisect import bisect_left from collections import defaultdict def solve(s, t, b, m) : temp = defaultdict(list) l = [0] * len(s) for i in range(len(s)) : temp['a'].append(i) low = 0 for i in range(len(t)) : indices = temp['a'] it = bisect_left(indices, low) if it == len(indices) : return False count = indices[it] // b l[count] = l[count] + 1 if l[count] >= m : count += 1 low = count * b else : low = indices[it] + 1 return True s = "mnonnopeqrst" t = "moprst" p = 5 q = 2 print (solve(s, t, p, q))
इनपुट
"mnonnopeqrst", "moprst", 5, 2
आउटपुट
True