দুটি লোয়ারকেস স্ট্রিং s এবং t দেওয়া আছে। একটি অপারেশনে যেকোনো একটি স্ট্রিং থেকে যেকোনো ক্যারেক্টার ডিলিট করা যায়। দুটি স্ট্রিং সমান করতে কমপক্ষে কত ডিলিশন দরকার তা বের করতে হবে।
সমস্যা উদাহরণ
ইনপুট: s = "pipe", t = "ripe"
আউটপুট: 2
ব্যাখ্যা: s- থেকে 'p' এবং t- থেকে 'r' ডিলিট করলে দুটোই "ipe" হয়ে যায়।
সমাধানের পদ্ধতি (ডাইনামিক প্রোগ্রামিং - LCS ভিত্তিক)
এই সমস্যাটি Longest Common Subsequence (LCS) খুঁজে বের করার সমান। উত্তর = len(s) + len(t) - 2 * LCS(s, t)।
রিকারসিভ DP পদ্ধতি:
m = len(s),n = len(t)dp(i, j)ফাংশন: s[i:] এবং t[j:] সমান করতে কমপক্ষে কত ডিলিশন লাগে- যদি
i == m:n - jরিটার্ন করুন (t-এর বাকি সব ডিলিট) - যদি
j == n:m - iরিটার্ন করুন (s-এর বাকি সব ডিলিট) - যদি
s[i] == t[j]:dp(i+1, j+1)রিটার্ন করুন - অন্যথায়:
1 + min(dp(i+1, j), dp(i, j+1))
- যদি
dp(0, 0)রিটার্ন করুন
পাইথন কোড
def solve(s, t):
m = len(s)
n = len(t)
def dp(i, j):
if i == m:
return n - j
elif j == n:
return m - i
else:
if s[i] == t[j]:
return dp(i + 1, j + 1)
else:
return 1 + min(dp(i + 1, j), dp(i, j + 1))
return dp(0, 0)
s = "pipe"
t = "ripe"
print(solve(s, t)) # আউটপুট: 2
টেস্ট কেস
ইনপুট: "pipe", "ripe"
আউটপুট: 2
নোট: বড় স্ট্রিংয়ের জন্য মেমোয়াইজেশন (lru_cache) ব্যবহার করা উচিত।