মান লিইয়ে নিই আমরা একটি টার্গেট স্ট্রিং তৈরি করতে চাই যা ছোট হাতের অক্ষর দিয়ে গঠিত।
প্রথমে, আমাদের সিকোয়েন্স হিসেবে nটি '?' চিহ্ন রয়েছে (n হল টার্গেট স্ট্রিং-এর দৈর্ঘ্য)। আমাদের একটি স্ট্যাম্পও রয়েছে যা ছোট হাতের অক্ষর দিয়ে গঠিত।
প্রতিটি tern-এ, আমরা সিকোয়েন্সের ওপর স্ট্যাম্পটি রাখতে পারি, এবং সিকোয়েন্সের প্রতিটি অক্ষরকে স্ট্যাম্পের соответствующий অক্ষর দিয়ে রিপ্লেস করতে পারি। আপনি 10 * n tern পর্যন্ত করতে পারেন। উদাহরণস্বরূপ যদি প্রাথমিক সিকোয়েন্স "?????" হয়, এবং স্ট্যাম্প "abc", তবে প্রথম tern-এ আমরা "abc??", "?abc?", "??abc" তৈরি করতে পারি।
যদি সিকোয়েন্স スタ্যাম্প করা সম্ভব হয়, তবে প্রতিটি tern-এ বামপাশের অক্ষর যে ইন্ডেক্সে স্ট্যাম্প হয়েছে তার ইন্ডেক্সের একটি অ্যারে ফেরত দিন। যদি সম্ভব না হয় তবে একটি খালি অ্যারে ফেরত দিন। সুতরাং যখন সিকোয়েন্স "ababc", এবং স্ট্যাম্প "abc", তবে উত্তর হতে পারে [0, 2], কারণ আমরা এমন बनाয় পেরি "?????" -> "abc??" -> "ababc"।
সুতরাং, যদি ইনপুট হয় stamp = "abcd", target = "abcdbcd", তবে আউটপুট হবে [3,0]
समाधान पद्धति
इसे हल करने के लिए, हम इन चरणों का पालन करेंगे:
- একটি ret সরণি সংজ্ঞায়িত করুন
- ok := true
- n := stamp-এর আকার
- tsz := 0
- যতক্ষণ ok নন-জিরো, করুন:
- ok := false
- x := 0
- sz := stamp-এর আকার থেকে आरंभ করুন, जब sz > 0, अपडेट करें (sz 1 কমান), করুন:
- i := 0 থেকে आरंभ করুন, जब i <= stamp-এর আকার, আপডেট করুন (i 1 বাড়ান), করুন:
- newStamp := i দৈর্ঘ্যের '*' স্ট্রিং + stamp-এর i থেকে sz-1 ইনডেক্স পর্যন্ত সাবস্ট্রিং + stamp-এর আকারের সমান দৈর্ঘ্যের '*' স্ট্রিং
- pos := target-এ newStamp-এর ইন্ডেক্স
- যতক্ষণ pos target-এ আছে, করুন:
- ok := true
- x := x + sz
- pos কে ret-এর শেষে যোগ করুন
- target-কে pos থেকে pos + stamp-এর আকার পর্যন্ত '*' দিয়ে ফিল করুন।
- pos := target-এ newStamp-এর ইন্ডেক্স
- i := 0 থেকে आरंभ করুন, जब i <= stamp-এর আকার, আপডেট করুন (i 1 বাড়ান), করুন:
- tsz := tsz + x
- ret সরণিটি রিভার্স করুন
- ফেরত দিন (যদি tsz, target-এর আকারের সমান হয়, তবে ret, অন্যথায় একটি খালি সরণি)
उदाहरण
बेहतर समझ के लिए निम्नलिखित कार्यान्वयन देखें:
#include <bits/stdc++.h> using namespace std; void print_vector(vector<auto> v){ cout << "["; for(int i = 0; i<v.size(); i++){ cout << v[i] << ", "; } cout << "]"<<endl; } class Solution { public: vector<int> movesToStamp(string stamp, string target) { vector<int> ret; bool ok = true; int n = stamp.size(); int tsz = 0; while (ok) { ok = false; int x = 0; for (int sz = stamp.size(); sz > 0; sz--) { for (int i = 0; i <= stamp.size() - sz; i++) { string newStamp = string(i, '*') + stamp.substr(i, sz) + string(stamp.size() - sz - i, '*'); int pos = target.find(newStamp); while (pos != string::npos) { ok = true; x += sz; ret.push_back(pos); fill(target.begin() + pos, target.begin() + pos + stamp.size(), '*'); pos = target.find(newStamp); } } } tsz += x; } reverse(ret.begin(), ret.end()); return tsz == target.size() ? ret : vector<int>(); } }; main(){ Solution ob; print_vector(ob.movesToStamp("abcd", "abcdbcd")); }
इनपुट
"abcd", "abcdbcd"
आउटपुट
[3, 0, ]