Leet code problem 20
Difficulty: Easy —
Given
Một chuỗi chứa toàn bộ các ký tự
1
'[', ']', '(', ')', '{', '}'
Expectation
Kiểm tra tính hợp lệ của chuỗi được test, chuỗi được xét là hợp lệ khi
- Mở ngoặc phải được đóng bởi dấu đóng ngoặc tương ứng
- Dấu ngoặc phải được đóng theo đúng thứ tự chúng được mở
- Mỗi dấu ngoặc đóng phải có một dấu mở ngoặc tương ứng
Solution
Yêu cầu có thể giải quyết được bằng cách sử dụng một stack
chứa toàn bộ các dấu đóng ngoặc.
Kiểm tra tính hợp lệ bằng cách so sánh ký tự trên cùng của stack
với ký tự tiếp theo được đưa vào stack
Cụ thể như sau
- Duyệt toàn bộ các ký tự của chuỗi
- Nếu ký tự được duyệt là dấu mở ngoặc
{ [ (
,push
ký tự đóng ngoặc tương ứng vàostack
- Nếu ký tự được duyệt là dấu đóng ngoặc
) ] }
vàstack
khôngempty
thì thực hiện so sánh ký tự này với ký tự cuối cùng được thêm vàostack
- Nếu trùng thì
pop
ký tự này ra khỏistack
- Nếu không trùng, đồng nghĩa với việc chuỗi hiện tại
không hợp lệ
- Nếu trùng thì
- Nếu ký tự được duyệt là dấu đóng ngoặc
) ] }
vàstack
empty
thì chuỗi hiện tại cũngkhông hợp lệ
vì lúc này không có ký tự nào mở ngoặc tương ứng được thêm vào trước ký tự đóng ngoặc này - Nếu duyệt hết toàn bộ ký tự của chuỗi và stack empty, xác nhận
chuỗi hợp lệ
Implementation
Code from github
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class L20_ValidParentheses {
public boolean isValid(String s) {
Stack<Character> stack = new Stack<Character>();
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (c == '{') {
stack.push('}');
} else if (c == '[') {
stack.push(']');
} else if (c == '(') {
stack.push(')');
} else if (stack.isEmpty() || stack.pop() != c) {
return false;
}
}
return stack.isEmpty();
}
}