سلسلة حل المشكلات (Problem Sloving) اليوم التسعة و عشرين

التحدي رقم 29 لليوم رقم 29 من رمضان

اولا
كل عام و انتم بخير و اعاده الله عليكم بالمن و بالخير و البركه

بالامس كنا نقول رمضان اهلا و اليوم نقول رمضان مهلا فاللهم اغفر لنا ما مضي و اصلح لنا ما بقي واختم لنا رمضان بخير و انت راض عنا

و لا تنسي تجديد نيتك فأن طلب العلم عباده
لا تنسوني و اخي المعتقل سياسيا من جميل دعائكم في هذه الليالي العشر

وصف التحدي :

متنساش تدعي لخواتنا ف غزه لو لسه عندك قلب و شوية دم

**مستوي التحدي : **
اعلي من (متوسط برمجيا)

قُم بكتابة دالة اسمها: isInterleave تستقبل ثلاث مُدخلات تحتوي قيم نصية A , B , C . تقوم هذه الدالة بإرجاع القيمة True فقط في حال كانت قيمة C عبارة عن أجزاء مُرتبة من القيمتين A و B . في حال كانت القيمة C تحتوي على جزء غير متواجد في القيمتين A و B ، أو متواجد بترتيب لا يتوافق مع الترتيب الأصلي في A و B ، تقوم الدالة بإرجاع القيمة False .

مثال للتوضيح

A = abc , B = dca ,C = abdcca

عند التفصيل في القيمة C نلاحظ أن القيمة ab تم اجتزائها من A ، ومن ثم القيمة dc اُجتزئت من B ، ومن ثم c من A مره أخرى، وأخيراً a من B . لا يهم الاجتزاء من أي قيمة يبدأ، ولا كمية الاجتزاء، المهم انه بنفس الترتيب المُتبع في القيمة الأصلية، ولا يزيد أو ينقص عن مجموع المتواجد في القيمتين A و B .

ملحوظه : تقدر تحل التحدي و تتحقق من صحته من خلال الموقع هنا اهو :
موقع سلسلة حل المشكلات (Problem Sloving)
بس خد بالك لو هتحل ع الموقع لازم اسم الداله يكون زي الاسم اللي موجود في وصف التحدي

أضغط لرؤية المخرجات المتوقعة عشان تتيست الكود بتاعك

الاختبار 1
المدخلات (Inputs)
A = ‘wysn’
B = ‘showus’
C = ‘shwysowuns’
المخرجات (Outputs)
true

الاختبار 2
المدخلات (Inputs)
A = ‘hsbxib’
B = ‘ywssg’
C = ‘hsywbxsisgb’
المخرجات (Outputs)
true

الاختبار 3
المدخلات (Inputs)
A = ‘zh2g’
B = ‘wts’
C = ‘shwt2gs’
المخرجات (Outputs)
false

الاختبار 4
المدخلات (Inputs)
A = ‘hsyhag’
B = ‘2b12’
C = ‘hsy2bhag1’
المخرجات (Outputs)
false

الاختبار 5
المدخلات (Inputs)
A = ‘USfMSU’
B = ‘5YgZ9N5mR6ppfggzbzh7HTox85MwFtaIQDHfzJW8vc2G’
C = ‘5YgUSZf9NM5SmR6Uppfggzbzh7HTox84MwFtaIQDHfzJW8vc2G’
المخرجات (Outputs)
false

حل التحدي
#29

def isInterleave(A, B, C):
    # لو طول C مش بيساوي مجموع أطوال A و B، يبقى مستحيل يكونوا متداخلين
    if len(C) != len(A) + len(B):
        return False

    memo = {}  # لتخزين النتائج المؤقتة (i, j)

    def dfs(i, j):
        # لو وصلنا لنهاية A و B، يبقى نجحنا
        if i == len(A) and j == len(B):
            return True

        # نشوف لو كنا حسبنا النتيجة قبل كده
        if (i, j) in memo:
            return memo[(i, j)]

        k = i + j  # المؤشر الحالي في C
        ans = False
        # لو الحرف الحالي في A هو نفسه الحرف الحالي في C، نجرب نكمل
        if i < len(A) and A[i] == C[k]:
            if dfs(i + 1, j):
                ans = True
        # لو ملقيناش حل من A، نجرب B
        if not ans and j < len(B) and B[j] == C[k]:
            if dfs(i, j + 1):
                ans = True

        memo[(i, j)] = ans
        return ans

    return dfs(0, 0)


4 إعجابات

هنا طبعا مينفعش استخدم :
if A or B not in C

عشان احنا ممكن ناخد حته منهم مش كلهم صح كدا ؟

إعجابَين (2)

3 إعجابات
def is_inter_leave(a,b,c) :
    if len(c) != len(a) + len(b) :
        return False 
    
    merge = a + b
    merge_list = []
    for x in merge :
        merge_list.append(x)
    
    for n in c :
        if n in merge_list :
            merge_list.remove(n)
    
    if len(merge_list) == 0 :
        return True 
    
    return False 
   

print(is_inter_leave("AcA","MCA","cCAAAM"))
print(is_inter_leave("wysn","showus","shwysowuns"))
print(is_inter_leave("zh2g","wts","shwt2gs"))
print(is_inter_leave("abc","a","abc"))







إعجاب واحد (1)

لو كتبت الحل دا في الموقع الموقع هيقولك غلط