কম্পিউটার টিউটোরিয়াল

Python-এ K-Similar Strings-এর জন্য K-এর ন্যূনতম মান বের করার প্রোগ্রাম


মনে করুন আমাদের কাছে s এবং t নামে দুটি স্ট্রিং আছে। এই দুটি স্ট্রিং K-similar হবে যদি আমরা s-এ দুটি লেটারের পজিশন সোয়াপ করে ঠিক K বার করলে ফলাফল t হয়। সুতরাং, আমাদের দুটি एনাগ্রাম s এবং t দেওয়া আছে, আমাদের সবচেয়ে ছোট K বের করতে হবে যাতে s এবং t K-similar হয়।

সুতরাং, যদি ইনপুট হয় s = "abc" t = "bac", তবে আউটপুট হবে 1।

এটি সমাধান করতে আমরা নিচের ধাপগুলো অনুসরণ করব −

  • একটি neighbors() ফাংশন ডিফাইন করুন। এটি new_data নেবে

  • new_data-এ প্রতিটি ইন্ডেক্স i এবং মান c-এর জন্য, করুন

    • যদি c != t[i] হয়, তবে

      • লুপ থেকে বের হোন

  • j = i+1 থেকে new_data-এর আকার - 1 পর্যন্ত জন্য, করুন

    • যদি u[j] == t[i] হয়, তবে

      • new_data[i] new_data[j] এক্সচেঞ্জ করুন

      • new_data-এ সব এলিমেন্ট জয়েন করে একটি স্ট্রিং জেনারেট করুন এবং রিটার্ন করুন, পরবর্তী কল থেকে এই এরিয়া থেকে আবার শুরু করুন

      • new_data[i] new_data[j] এক্সচেঞ্জ করুন

  • মেইন মেথড থেকে, নিচের কাজ করুন:

  • q := একটি কিউ বানান এবং জোড়া (s, 0) ইনসার্ট করুন

  • seen := s থেকে একটি নতুন সেট

  • যতক্ষণ q খালি নয়, করুন

    • (u, swap_cnt) := q-এর প্রথম আইটেম এবং q থেকে মুছে দিন

    • যদি u == t হয়, তবে

      • swap_cnt রিটার্ন করুন

    • u-কে লিস্ট বানাতে neighbors(u as list)-এ প্রতিটি v-এর জন্য, করুন

      • যদি v seen-এ না থাকে, তবে

        • v কে seen হিসেবে মার্ক করুন

        • q-এর শেষে (v, swap_cnt+1) ইনসার্ট করুন

  • 0 রিটার্ন করুন

উদাহরণ

বेहतर বোঝার জন্য নিচের ইমপ্লিমেন্টেশন দেখুন

from collections import deque

def solve(s, t):
    def swap(data, i, j):
        data[i], data[j] = data[j], data[i]
    def neighbors(new_data):
        for i, c in enumerate(new_data):
            if c != t[i]:
                break
        for j in range(i+1, len(new_data)):
            if u[j] == t[i]:
                swap(new_data, i, j)
                yield "".join(new_data)
                swap(new_data, i, j)
    q = deque([(s, 0)])
    seen = set(s)
    while q:
        u, swap_cnt = q.popleft()
        if u == t:
            return swap_cnt
        for v in neighbors(list(u)):
            if v not in seen:
                seen.add(v)
                q.append((v, swap_cnt+1))
    return 0

s = "abc"
t = "bac"
print(solve(s, t))

ইনপুট

"abc, bac"

আউটপুট

1

  1. Python-এ ডায়реक्टেড গ্রাফে সর্বোচ্চ রঙ মান বের করার প্রোগ্রাম

  2. পাইথন প্রোগ্রাম লিস্টে সবচেয়ে ছোট সংখ্যা বের করা

  3. পাইথন প্রোগ্রাম: ২ডি অ্যারে-তে k-তম ছোট এলিমেন্ট বের করা

  4. পাইথন প্রোগ্রাম: মডুলার এক্সপোনেনশিয়েশন (Modular Exponentiation)