Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> JavaScript

ตรวจสอบ Brackets (วงเล็บ) ในสตริง JavaScript

โจทย์

ตรวจสอบว่าเครื่องหมายวงเล็บในสตริง คู่กันถูกต้อง (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

  1. สร้าง Stack ว่าง
  2. อ่านทีละตัวอักษร:
    • ถ้าเป็น Opening bracket → Push เข้า Stack
    • ถ้าเป็น Closing bracket → Pop จาก Stack ตรวจสอบว่าคู่กัน
  3. จบลูป: 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