โจทย์
ตรวจสอบว่าเครื่องหมายวงเล็บในสตริง คู่กันถูกต้อง (Balanced) หรือไม่ รองรับวงเล็บเปิด '(' และปิด ')'
ตัวอย่าง
'(hello (world))' → true '(hello (world)' → false
โค้ดตัวอย่าง (Counter Approach)
const str1 = '(hello (world))';
const str2 = '(hello (world)';
const validateBrackets = (str = '') => {
const strArr = str.split('');
let counter = 0;
for (let i = 0, len = strArr.length; i < len; i++) {
if (strArr[i] === '(') {
counter++;
} else if (strArr[i] === ')') {
counter--;
}
// ปิดมากกว่าเปิด = ผิดทันที
if (counter < 0) return false;
}
// ต้องคู่กันหมด
return counter === 0;
};
console.log(validateBrackets(str1)); // true
console.log(validateBrackets(str2)); // false
ผลลัพธ์
true false
ขยาย: รองรับวงเล็บทุกชนิด () [] {}
const validateAllBrackets = (str) => {
const stack = [];
const pairs = { '(': ')', '[': ']', '{': '}' };
const opening = Object.keys(pairs);
const closing = Object.values(pairs);
for (const char of str) {
if (opening.includes(char)) {
stack.push(char);
} else if (closing.includes(char)) {
if (stack.length === 0) return false;
const last = stack.pop();
if (pairs[last] !== char) return false; // ไม่คู่
}
}
return stack.length === 0;
};
// ทดสอบ
console.log(validateAllBrackets('({[]})')); // true
console.log(validateAllBrackets('({[})')); // false
console.log(validateAllBrackets('([)]')); // false
console.log(validateAllBrackets('function() { return [1,2]; }')); // true
Algorithm: Stack-Based
- สร้าง Stack ว่าง
- อ่านทีละตัวอักษร:
- ถ้าเป็น Opening bracket → Push เข้า Stack
- ถ้าเป็น Closing bracket → Pop จาก Stack ตรวจสอบว่าคู่กัน
- จบลูป: Stack ต้องว่างเปล่า
ความซับซ้อน
- Time: O(n) - เดินผ่านสตริง 1 ครั้ง
- Space: O(n) - Stack เก็บ opening brackets สูงสุด n/2
การประยุกต์
- Code Editor: Bracket Matching
- Compiler/Interpreter: Syntax Validation
- Math Expression Parser
- XML/HTML Tag Validation