20. Valid Parentheses
Given a string s containing just the characters '(', ')', '{', '}', '[' and ']', determine if the input string is valid.
An input string is valid if:
- Open brackets must be closed by the same type of brackets.
- Open brackets must be closed in the correct order.
- Every close bracket has a corresponding open bracket of the same type.
Example 1:
Input: s = "()"
Output: true
Example 2:
Input: s = "()[]{}"
Output: true
Example 3:
Input: s = "(]"
Output: false
Example 4:
Input: s = "([])"
Output: true
Example 5:
Input: s = "([)]"
Output: false
Constraints:
1 <= s.length <= 104sconsists of parentheses only'()[]{}'.
class Solution {
public:
bool isValid(string s) {
if (s.length() % 2 != 0) return false;
// Vì ngoặc luôn đi theo cặp, độ dài lẻ chắc chắn là sai.
unordered_map <char,char> mp ={
{')', '('},
{'}','{'},
{']','['}
};
stack<char> st;
for (char c: s){
if(c == '(' || c== '{' || c== '['){
st.push(c);
}else{
if(st.empty() || st.top() != mp[c]){
return false;
}
st.pop();
}
}
return st.empty();
}
};
Chạy từng bước (dry run) với input s = "([)]"
Giả sử bảng tra cứu mp của chúng ta là:
-
)=>( -
]=>[ -
}=>{
Quá trình Dry Run
Khởi tạo: stack<char> st (rỗng).
| Bước | Ký tự (c) | Loại ngoặc | Hành động | Trạng thái Stack (đáy → đỉnh) | Kết quả kiểm tra |
| 1 | ( |
Mở | st.push('(') |
['('] |
Tiếp tục |
| 2 | [ |
Mở | st.push('[') |
['(', '['] |
Tiếp tục |
| 3 | ) |
Đóng | Kiểm tra st.top() |
['(', '['] |
Lỗi! (Xem chi tiết dưới) |
Phân tích chi tiết tại Bước 3:
Khi gặp ký tự ), chương trình sẽ thực hiện các lệnh sau:
-
Kiểm tra
st.empty(): Stack hiện có 2 phần tử nên không trống. -
Lấy phần tử trên cùng:
st.top()trả về'['. -
Tra cứu mã khớp:
mp[')']trả về'('. -
So sánh:
st.top() != mp[')']tương đương với'[' != '('.
Vì hai ký tự này không khớp nhau, điều kiện if được thỏa mãn và hàm ngay lập tức return false.
Tại sao nó lại hoạt động như vậy?
Trong cấu trúc ngoặc hợp lệ, dấu ngoặc đóng phải khớp với dấu ngoặc mở gần nó nhất chưa được đóng.
-
Ở bước 3, dấu ngoặc mở gần nhất là
[(nằm ở đỉnh stack). -
Nhưng dấu ngoặc đóng xuất hiện lại là
). -
Việc "đóng nhảy cóc" này vi phạm quy tắc: Open brackets must be closed in the correct order.
Kết luận: Chuỗi "([)]" là không hợp lệ vì dấu ( bị chặn bởi dấu [ chưa đóng, nên nó không thể "gặp" dấu ) của mình được.