ধরুন আমরা n নম্বর স্ট্রিং প্রদান করেছি; str1, str2, str3,.....,strn. এখন, ধরুন যে substri হল একটি সেট যাতে স্ট্রির সমস্ত সাবস্ট্রিং রয়েছে। সমস্ত সাবস্ট্র সেটের মিলন হল substr_union। আমাদের এখন প্রশ্নগুলির q নম্বর দেওয়া হয়েছে, এবং আমাদের সেট substr_union-এর q-th উপাদান খুঁজে বের করতে হবে। সেট substr_union অভিধানিকভাবে সাজানো হয়েছে এবং সূচীগুলি 1 থেকে শুরু হয়।
সুতরাং, যদি ইনপুটটি স্ট্রিংগুলির তালিকার মতো হয় =['pqr', 'pqt'], প্রশ্নগুলি =[4, 7, 9], তাহলে আউটপুট হবে ['pqt', 'qt', 't' ]
প্রথম স্ট্রিং থেকে সাবস্ট্রিংগুলি হল subs_str_1 ={p, pq, pqr, q, qr, r }, sub_str_2 ={p, pq, pqt, q, qt, t}।
এই দুটি সেটের মিলন, বা substr_union হল {p, pq, pqr, pqt, q, qr, qt, r, t}।
সুতরাং সূচক 4, 7, এবং 9 এ আইটেমগুলি যথাক্রমে 'pqt', qt' এবং 't'।
এটি সমাধান করতে, আমরা এই পদক্ষেপগুলি অনুসরণ করব -
- একটি ফাংশন সংজ্ঞায়িত করুন lng_i()। এটি suff, lng, i
- লাগবে
- d :=একটি নতুন টিপল যাতে রয়েছে (suff, lng)
- lo :=0
- হাই :=0
- প্রতিটি টিপলের জন্য (suf, lng) d, do
- যদি lng null এর মত হয়, তাহলে
- lng :=0
- hi :=hi + suf - lng এর আকার
- যদি hi - 1 i এর মত হয়, তাহলে
- সুফ ফেরত
- অন্যথায় যখন hi - 1> i, তারপর
- lng থেকে suf এর আকার পর্যন্ত মানের তালিকায় সূচী p এবং আইটেম q এর জন্য, করুন
- যদি lo + p হয় i এর মতো, তাহলে
- সাফ [সূচক 0 থেকে j+1] ফেরত দিন
- যদি lo + p হয় i এর মতো, তাহলে
- যদি lng null এর মত হয়, তাহলে
- lo :=হাই
- মিথ্যে ফেরত দিন
- লাগবে
- ub :=str1 এর ন্যূনতম আকার, str2 এর আকার
- cnt :=0
- আমি 0 থেকে ub এর মধ্যে, কর
- যদি str1[i] str2[i] এর মত হয়, তাহলে
- cnt :=cnt + 1
- অন্যথায়,
- cnt ফেরত
- cnt ফেরত
- যদি str1[i] str2[i] এর মত হয়, তাহলে
-
আমি 0 থেকে str এর আকারের মধ্যে, কর
- মান :=str[সূচী i থেকে শেষ পর্যন্ত]
- যদি t_dict-এ মান উপস্থিত না থাকে, তাহলে
- t_dict[মান] :=1
- suff-এর শেষে মান সন্নিবেশ করান
- যদি আমি 0 এর মত হয়, তাহলে
- lng-এর শেষে নাল ঢোকান
- অন্যথায়,
- lng-এর শেষে hlp_ii(suff[i-1], suff[i]) ঢোকান
- res এর শেষে সন্নিবেশ করুন (lng_i(suff, lng, q-1))
উদাহরণ
আরো ভালোভাবে বোঝার জন্য আসুন নিচের বাস্তবায়ন দেখি -
def lng_i(suff, lng, i):
d = zip(suff,lng)
lo = hi = 0
for suf, lng in d:
if lng is None:
lng = 0
hi += len(suf) - lng
if hi - 1 == i:
return suf
elif hi - 1 > i:
for p, q in enumerate(list(range(lng, len(suf)))):
if lo + p == i:
return suf[:q+1]
lo = hi
return False
def hlp_ii(str1,str2):
ub = min(len(str1), len(str2))
cnt = 0
for i in range(ub):
if str1[i] == str2[i]:
cnt += 1
else:
return cnt
return cnt
def solve(strings,q_list):
t_dict = {}
suff = []
lng = []
for str in strings:
for i in range(len(str)):
value = str[i:]
if value not in t_dict:
t_dict[value] = 1
suff.append(value)
suff.sort()
suff_len = len(suff)
for i in range(suff_len):
if i == 0:
lng.append(None)
else:
lng.append(hlp_ii(suff[i-1], suff[i]))
res = []
for q in q_list:
(res.append(lng_i(suff, lng, q-1)))
return res
print(solve(['pqr', 'pqt'], [4, 7, 9])) ইনপুট
['pqr', 'pqt'], [4, 7, 9]
আউটপুট
['pqt', 'qt', 't']