Mô tả bài toán
Cho chuỗi s chứa dấu ngoặc '(', ')' và chữ cái thường. Hãy xóa số lượng dấu ngoặc tối thiểu để chuỗi kết quả hợp lệ. Chuỗi ngoặc hợp lệ khi: rỗng/chỉ chứa chữ cái; hoặc dạng AB (A, B hợp lệ); hoặc dạng (A) (A hợp lệ).
Ví dụ
Nếu đầu vào là s = "m)n(o)p", thì đầu ra sẽ là "mn(o)p".
Giải thuật
- Dùng stack lưu chỉ số của
'(', tập hợpindexeslưu chỉ số cần xóa. - Duyệt chuỗi: gặp
'('đẩy chỉ số vào stack; gặp')'nếu stack rỗng thì thêm chỉ số vàoindexes, ngược lại pop stack. - Hợp nhất
indexesvới các chỉ số còn lại trong stack. - Xây dựng chuỗi kết quả bỏ qua các chỉ số trong
indexes.
Triển khai Python
def solve(s):
stack = []
indexes = set()
i = 0
for c in s:
if c == '(':
stack.append(i)
elif c == ')':
if len(stack) == 0:
indexes.add(i)
else:
stack.pop()
i += 1
ret = ''
indexes = indexes.union(stack)
for i in range(len(s)):
if i not in indexes:
ret += s[i]
return ret
s = "m)n(o)p"
print(solve(s))
Đầu vào
"m)n(o)p"
Đầu ra
mn(o)p