สมมติว่าเรามีสตริง s ที่มีวงเล็บ "(" และ ")" เราต้องการหาความยาวของลำดับย่อย (subsequence) ที่มีวงเล็บสมดุล (balanced brackets) มากที่สุด
ตัวอย่างเช่น หาก s = "())(()("` ผลลัพธ์จะเป็น 4 เนื่องจากเราสามารถเลือก subsequence เป็น "()()"
ขั้นตอนการแก้ปัญหา (Greedy จากขวาไปซ้าย)
res = 0,n = len(s),close = 0- วนลูป
iจากn-1ถึง 0 (ถอยหลัง):- หาก
s[i] == ")"ให้close += 1 - มิฉะนั้น (เป็น "("):
- หาก
0ให้close -= 1และres += 2
- หาก
- หาก
- คืนค่า
res
ตัวอย่างโค้ด Python
class Solution:
def solve(self, s):
res = 0
n = len(s)
close = 0
for i in range(n - 1, -1, -1):
if s[i] == ")":
close += 1
else:
if close > 0:
close -= 1
res += 2
return res
ob = Solution()
s = "())(()("
print(ob.solve(s)) # Output: 4
อินพุต
"())(()("
เอาต์พุต
4