কম্পিউটার

পাইথনের সমস্ত সম্ভাব্য সাবস্ট্রিংগুলির একটি সেটে প্রদত্ত অবস্থানে প্রদত্ত স্ট্রিংগুলির সাবস্ট্রিংগুলি খুঁজে বের করার জন্য প্রোগ্রাম


ধরুন আমরা 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 :=হাই
    • মিথ্যে ফেরত দিন
  • একটি ফাংশন hlp_ii() সংজ্ঞায়িত করুন। এটি str1,str2
      লাগবে
    • ub :=str1 এর ন্যূনতম আকার, str2 এর আকার
    • cnt :=0
    • আমি 0 থেকে ub এর মধ্যে, কর
      • যদি str1[i] str2[i] এর মত হয়, তাহলে
        • cnt :=cnt + 1
      • অন্যথায়,
        • cnt ফেরত
      • cnt ফেরত
  • t_dict :=একটি নতুন মানচিত্র
  • suff :=একটি নতুন তালিকা
  • lng :=একটি নতুন তালিকা
  • স্ট্রিং-এর প্রতিটি str-এর জন্য, করুন
    • আমি 0 থেকে str এর আকারের মধ্যে, কর

      • মান :=str[সূচী i থেকে শেষ পর্যন্ত]
      • যদি t_dict-এ মান উপস্থিত না থাকে, তাহলে
        • t_dict[মান] :=1
        • suff-এর শেষে মান সন্নিবেশ করান
  • তালিকাটি সাজান
  • suff_len :=suff এর আকার
  • আমি 0 থেকে suff_len এর আকারের মধ্যে, কর
    • যদি আমি 0 এর মত হয়, তাহলে
      • lng-এর শেষে নাল ঢোকান
    • অন্যথায়,
      • lng-এর শেষে hlp_ii(suff[i-1], suff[i]) ঢোকান
  • res :=একটি নতুন তালিকা
  • q_list এর প্রতিটি q এর জন্য, করুন
    • 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']

  1. পাইথনে প্রদত্ত পরিসর থেকে একটি অঙ্কের ঘটনা খুঁজে বের করার জন্য প্রোগ্রাম

  2. পাইথনে সমস্ত শহরের সর্বাধিক সম্ভাব্য জনসংখ্যা খুঁজে পাওয়ার প্রোগ্রাম

  3. পাইথনে পছন্দগুলি গ্রহণ করে সমস্ত সম্ভাব্য স্ট্রিং তৈরি করার প্রোগ্রাম

  4. পাইথনে প্রদত্ত সংখ্যার সমস্ত অঙ্কের যোগফল খুঁজে বের করার প্রোগ্রাম