otwarte = '([{<'
zamkniete = ')]}>'
# sprawdza czy nawias jest otwarty
def czyOtwarty(nawias):
return nawias in otwarte
# sprawdza czy nawias jest zamkniety
def czyZamkniety(nawias):
return nawias in zamkniete
# sprawdza czy indeksy nawiasow otwartego i zamknietego sa takie same '(' = 0, '[' = 1, ...
def czyPasuja(otwarty, zamkniety):
return otwarte.index(otwarty) == zamkniete.index(zamkniety)
# funkcja sprawdzajaca, nawiasy i stos do odkladania nawiasow (string, string)
def czyNawiasyPasuja(nawiasy, stos):
# czy nawiasy sa puste, C++ nawiasy.isEmpty()
if len(nawiasy) == 0:
# zwraca czy stos pusty, C++ stos.isEmpty()
return len(stos) == 0
# czy nawias pierwszy jest otwarty
elif czyOtwarty(nawiasy[0]):
# szuka zamknietych nawiasow bez tego pierwszego, odkladajac ten otwarty na stos
return czyNawiasyPasuja(nawiasy[1:], nawiasy[0] + stos)
# czy nawias pierwszy zamkniety
elif czyZamkniety(nawiasy[0]):
# czy stos nie pusty i czy uzgodnilo nawiasy i czy obciete nawiasy i stos pasuja
return (len(stos) != 0) and czyPasuja(stos[0], nawiasy[0]) and czyNawiasyPasuja(nawiasy[1:], stos[1:])
else:
# inaczej gdy napotka inny znak szuka dalej
return czyNawiasyPasuja(nawiasy[1:], stos)
testy = ['([()]())()', '(()[()])()', '(()())[()]', '([()()])()', '[(()())]()', '[(()())()]']
for test in testy:
print(test + ' = ' + str(czyNawiasyPasuja(test, '')))
'''
test = '([()]())()'
czyNawiasyPasuja('([()]())()', '')
czyOtwarty('(')
czyNawiasyPasuja('[()]())()', '(')
czyOtwarty('[')
czyNawiasyPasuja('()]())()', '[(')
czyOtwarty('(')
czyNawiasyPasuja(')]())()', '([(')
czyZamkniety(')')
czyNawiasyPasuja(']())()', '[(')
czyZamkniety(']')
czyNawiasyPasuja('())()', '(')
czyOtwarty('(')
czyNawiasyPasuja('))()', '((')
czyZamkniety(')')
czyNawiasyPasuja(')()', '(')
czyZamkniety(')')
czyNawiasyPasuja('()', '')
czyOtwarty('(')
czyNawiasyPasuja(')', '(')
czyZamkniety(')')
czyNawiasyPasuja('', '')
'' == 0
True
True
True
True
True
True
True
True
True
True
True
'''
b3R3YXJ0ZSA9ICcoW3s8Jwp6YW1rbmlldGUgPSAnKV19PicKCiMgc3ByYXdkemEgY3p5IG5hd2lhcyBqZXN0IG90d2FydHkKZGVmIGN6eU90d2FydHkobmF3aWFzKToKICAgIHJldHVybiBuYXdpYXMgaW4gb3R3YXJ0ZQoKIyBzcHJhd2R6YSBjenkgbmF3aWFzIGplc3QgemFta25pZXR5CmRlZiBjenlaYW1rbmlldHkobmF3aWFzKToKICAgIHJldHVybiBuYXdpYXMgaW4gemFta25pZXRlCgojIHNwcmF3ZHphIGN6eSBpbmRla3N5IG5hd2lhc293IG90d2FydGVnbyBpIHphbWtuaWV0ZWdvIHNhIHRha2llIHNhbWUgJygnID0gMCwgJ1snID0gMSwgLi4uCmRlZiBjenlQYXN1amEob3R3YXJ0eSwgemFta25pZXR5KToKICAgIHJldHVybiBvdHdhcnRlLmluZGV4KG90d2FydHkpID09IHphbWtuaWV0ZS5pbmRleCh6YW1rbmlldHkpCgojIGZ1bmtjamEgc3ByYXdkemFqYWNhLCBuYXdpYXN5IGkgc3RvcyBkbyBvZGtsYWRhbmlhIG5hd2lhc293IChzdHJpbmcsIHN0cmluZykKZGVmIGN6eU5hd2lhc3lQYXN1amEobmF3aWFzeSwgc3Rvcyk6CiAgICAjIGN6eSBuYXdpYXN5IHNhIHB1c3RlLCBDKysgbmF3aWFzeS5pc0VtcHR5KCkKICAgIGlmIGxlbihuYXdpYXN5KSA9PSAwOgogICAgICAgICMgendyYWNhIGN6eSBzdG9zIHB1c3R5LCBDKysgc3Rvcy5pc0VtcHR5KCkKICAgICAgICByZXR1cm4gbGVuKHN0b3MpID09IDAKICAgICMgY3p5IG5hd2lhcyBwaWVyd3N6eSBqZXN0IG90d2FydHkKICAgIGVsaWYgY3p5T3R3YXJ0eShuYXdpYXN5WzBdKToKICAgICAgICAjIHN6dWthIHphbWtuaWV0eWNoIG5hd2lhc293IGJleiB0ZWdvIHBpZXJ3c3plZ28sIG9ka2xhZGFqYWMgdGVuIG90d2FydHkgbmEgc3RvcwogICAgICAgIHJldHVybiBjenlOYXdpYXN5UGFzdWphKG5hd2lhc3lbMTpdLCBuYXdpYXN5WzBdICsgc3RvcykKICAgICMgY3p5IG5hd2lhcyBwaWVyd3N6eSB6YW1rbmlldHkKICAgIGVsaWYgY3p5WmFta25pZXR5KG5hd2lhc3lbMF0pOgogICAgICAgICMgY3p5IHN0b3MgbmllIHB1c3R5IGkgY3p5IHV6Z29kbmlsbyBuYXdpYXN5IGkgY3p5IG9iY2lldGUgbmF3aWFzeSBpIHN0b3MgcGFzdWphCiAgICAgICAgcmV0dXJuIChsZW4oc3RvcykgIT0gMCkgYW5kIGN6eVBhc3VqYShzdG9zWzBdLCBuYXdpYXN5WzBdKSBhbmQgY3p5TmF3aWFzeVBhc3VqYShuYXdpYXN5WzE6XSwgc3Rvc1sxOl0pCiAgICBlbHNlOgogICAgICAgICMgaW5hY3plaiBnZHkgbmFwb3RrYSBpbm55IHpuYWsgc3p1a2EgZGFsZWoKICAgICAgICByZXR1cm4gY3p5TmF3aWFzeVBhc3VqYShuYXdpYXN5WzE6XSwgc3RvcykKCnRlc3R5ID0gWycoWygpXSgpKSgpJywgJygoKVsoKV0pKCknLCAnKCgpKCkpWygpXScsICcoWygpKCldKSgpJywgJ1soKCkoKSldKCknLCAnWygoKSgpKSgpXSddCmZvciB0ZXN0IGluIHRlc3R5OgogICAgcHJpbnQodGVzdCArICcgPSAnICsgc3RyKGN6eU5hd2lhc3lQYXN1amEodGVzdCwgJycpKSkKCicnJwogICAgdGVzdCA9ICcoWygpXSgpKSgpJwogICAgCiAgICBjenlOYXdpYXN5UGFzdWphKCcoWygpXSgpKSgpJywgJycpCiAgICAgIGN6eU90d2FydHkoJygnKQogICAgICBjenlOYXdpYXN5UGFzdWphKCdbKCldKCkpKCknLCAnKCcpCiAgICAgICAgY3p5T3R3YXJ0eSgnWycpCiAgICAgICAgY3p5TmF3aWFzeVBhc3VqYSgnKCldKCkpKCknLCAnWygnKQogICAgICAgICAgY3p5T3R3YXJ0eSgnKCcpCiAgICAgICAgICBjenlOYXdpYXN5UGFzdWphKCcpXSgpKSgpJywgJyhbKCcpCiAgICAgICAgICAgIGN6eVphbWtuaWV0eSgnKScpCiAgICAgICAgICAgIGN6eU5hd2lhc3lQYXN1amEoJ10oKSkoKScsICdbKCcpCiAgICAgICAgICAgICAgY3p5WmFta25pZXR5KCddJykKICAgICAgICAgICAgICBjenlOYXdpYXN5UGFzdWphKCcoKSkoKScsICcoJykKICAgICAgICAgICAgICAgIGN6eU90d2FydHkoJygnKQogICAgICAgICAgICAgICAgY3p5TmF3aWFzeVBhc3VqYSgnKSkoKScsICcoKCcpCiAgICAgICAgICAgICAgICAgIGN6eVphbWtuaWV0eSgnKScpCiAgICAgICAgICAgICAgICAgIGN6eU5hd2lhc3lQYXN1amEoJykoKScsICcoJykKICAgICAgICAgICAgICAgICAgICBjenlaYW1rbmlldHkoJyknKQogICAgICAgICAgICAgICAgICAgIGN6eU5hd2lhc3lQYXN1amEoJygpJywgJycpCiAgICAgICAgICAgICAgICAgICAgICBjenlPdHdhcnR5KCcoJykKICAgICAgICAgICAgICAgICAgICAgIGN6eU5hd2lhc3lQYXN1amEoJyknLCAnKCcpCiAgICAgICAgICAgICAgICAgICAgICAgIGN6eVphbWtuaWV0eSgnKScpCiAgICAgICAgICAgICAgICAgICAgICAgIGN6eU5hd2lhc3lQYXN1amEoJycsICcnKQogICAgICAgICAgICAgICAgICAgICAgICAgICcnID09IDAKICAgICAgICAgICAgICAgICAgICAgICAgVHJ1ZQogICAgICAgICAgICAgICAgICAgICAgVHJ1ZQogICAgICAgICAgICAgICAgICAgIFRydWUKICAgICAgICAgICAgICAgICAgVHJ1ZQogICAgICAgICAgICAgICAgVHJ1ZQogICAgICAgICAgICAgIFRydWUKICAgICAgICAgICAgVHJ1ZQogICAgICAgICAgVHJ1ZQogICAgICAgIFRydWUKICAgICAgVHJ1ZQogICAgVHJ1ZQonJyc=