2013.12.7 00:03
Given a string containing just the characters '('
, ')'
, '{'
, '}'
, '['
and ']'
, determine if the input string is valid.
The brackets must close in the correct order, "()"
and "()[]{}"
are all valid but "(]"
and "([)]"
are not.
Solution:
Matching parentheses can be well handled with a stack. Left brackets are pushed into the stack, while right brackets are popped together with the matching left brackets on the stack top. If a matching is impossible, the sequence is invalid.
Time complexity is O(n), space complexity is O(n), where $n is the length of the sequence.
Accepted code:
1 // 1WA, 1AC 2 class Solution { 3 public: 4 bool isValid(string s) { 5 // IMPORTANT: Please reset any member data you declared, as 6 // the same Solution instance will be reused for each test case. 7 if(s == ""){ 8 return true; 9 } 10 11 stack = new char[s.length()]; 12 if(stack == nullptr){ 13 return false; 14 } 15 16 bool ret; 17 int i, len; 18 19 pc = 0; 20 len = s.length(); 21 ret = true; 22 for(i = 0; i < len; ++i){ 23 switch(s[i]){ 24 case '(': 25 case '[': 26 case '{': 27 stack[pc++] = s[i]; 28 break; 29 case ')': 30 if(pc <= 0 || stack[pc - 1] != '('){ 31 ret = false; 32 }else{ 33 --pc; 34 } 35 break; 36 case ']': 37 if(pc <= 0 || stack[pc - 1] != '['){ 38 ret = false; 39 }else{ 40 --pc; 41 } 42 break; 43 case '}': 44 if(pc <= 0 || stack[pc - 1] != '{'){ 45 ret = false; 46 }else{ 47 --pc; 48 } 49 break; 50 default: 51 ret = false; 52 break; 53 } 54 if(!ret){ 55 break; 56 } 57 } 58 // 1WA here, if stack is not empty, the sequence is invalid. 59 if(pc != 0){ 60 ret = false; 61 } 62 63 delete[] stack; 64 stack = nullptr; 65 return ret; 66 } 67 private: 68 char *stack; 69 int pc; 70 };