First Thought: limping traversal, checking half the length of the string, incrementing traversing index by 2. --> problem: two types of cases possible: 옆에 연속으로 붙어 있는 괄호들, 아니면 괄호 안에 감싸는 괄호 조합
My Failed Solution:
class Solution {
public boolean isValid(String s) {
//traverse increment by two, check based on this index
HashMap<Character, Integer> map = new HashMap<>();
for (char c : s.toCharArray()) {
map.putIfAbsent(c, 0);
map.put(c, map.get(c)+1);
}
if (map.get('(')!=map.get(')')||map.get('{')!=map.get('}')||
map.get('[')!=map.get(']')) return false;
for (int i=0; i<s.length()/2; i++) {
switch(s.charAt(i)) {
case '(':
if (s.charAt(s.length()-i-1)!=')'&&s.charAt(i+1)!=')') {
return false;
}
break;
case '{':
if (s.charAt(s.length()-i-1)!='}'&&s.charAt(i+1)!='}') {
return false;
}
break;
case '[':
if (s.charAt(s.length()-i-1)!=']'&&s.charAt(i+1)!=']') {
return false;
}
break;
}
}
return true;
}
}
문제점: 케이스가 너무 많고 복잡해진다. 먼저 괄호 종류에 따라서 나누고, 그에 따라 연속성 케이스1 인지, 괄호안에 있는 케이스2 인지, 그 둘의 조합인지, 판단을 하고 그 방법을 flexible하게 다루기에는 너무 얽혀있다.
Ideal Solution: using Stack
Stack<Character> stack = new Stack<>();
for (int i=0; i<s.length(); i++) {
if (s.charAt(i)=='(') stack.push(')');
else if (s.charAt(i)=='{') stack.push('}');
else if (s.charAt(i)=='[') stack.push(']');
else if (stack.isEmpty() || stack.pop()!=s.charAt(i)) return false;
}
return stack.isEmpty();