유효한 괄호, Facebook 인터뷰 질문 해결.
질문: '(', ')', '{', '}', '[' 및 ']' 문자만 포함하는 문자열이 주어지면 입력 문자열이 유효한지 확인하십시오.
다음과 같은 경우 입력 문자열이 유효합니다.
열린 괄호는 같은 유형의 괄호로 닫아야 합니다.
여는 괄호는 올바른 순서로 닫아야 합니다.
빈 문자열은 유효한 것으로 간주됩니다.
예:
string = "()[]{}" //valid
string = "[{()]}" //invalid
string = "" //valid
이것을 해결하자,
최소한 문제는 일치하는 여는 괄호와 닫는 괄호를 찾도록 요청하는 것입니다. 그래서 :
"(", ")"는 유효한 닫는 괄호입니다.
"{", "}"는 유효한 닫는 괄호입니다.
"[", "]"는 유효한 닫는 괄호입니다.
또는 다른 말로, 우리는 "쌍"이 서로 상쇄된다고 말할 수 있습니다. 여기서 우리는 순서가 중요하다고 말할 수 있습니다.
우리에게 도움이 될 좋은 데이터 구조:
1> 괄호를 저장하고 일치하는 항목이 발견되면 취소하고,
2 > 괄호 추적하기
스택입니다. 여는 괄호를 스택에 푸시하고 닫는 괄호를 만나면 팝합니다. 동시에 닫는 괄호가 팝되는 괄호와 유효한 일치인지 확인할 수 있습니다.
구현 - 1
여기서 우리는 문자열이 유효하지 않은 경우에도 길이가 있는지 확인하는 작은 최적화를 만들 수 있습니다.
위의 아이디어를 코드로 변환 :
var isValid = function(S) {
let stack = [];
if(S == '') return true;
if(S%2 != 0) return false;
for(let s of S){
if(s == '(' || s == '{' || s == '['){
stack.push(s);
}else{
if(stack.length == 0) return false;
let c = stack.pop();
if(c == '(' && s != ')'){
return false;
}
if(c == '{' && s != '}'){
return false;
}
if(c == '[' && s != ']'){
return false;
}
}
}
if(stack.length != 0) return false; // for conditions like "{([])}}}"
return true;
};
이제 잘 작동하지만 더 잘할 수 있습니까? "쌍"을 확인하기 위한 if-else 조건이 많이 있습니다. 더 간결하게 만들어 보겠습니다.
구현 - 2
if 조건의 주요 작업은 괄호를 일치시키는 것이므로 다른 데이터 구조인 해시맵을 사용합니다.
닫는 괄호는 해당하는 여는 괄호와 일치해야 하므로 닫는 괄호와 여는 괄호 사이에 매핑을 만듭니다.
따라서 알고리즘은 다음과 같이 작동합니다.
1 > 현재 기호가 해시맵에 있는지 확인하고 그렇지 않은 경우 스택에 푸시합니다.
2 > 현재 기호가 해시맵에 있는 경우 스택에서 팝하고 해시맵 항목에 해당하는 값과 비교합니다.
따라서 현재 기호의 맨 위가 ")"이면 스택에서 팝되고 팝된 값을 "("인 해시맵의 ")"에 해당하는 값과 비교합니다. 동일하지 않으면 문자열이 유효하지 않은 것입니다.
코드는 그것을 훨씬 명확하게 할 것입니다.
var isValid = function(S) {
if(S == '') return true;
if(S.length%2 != 0) return false;
let map = {};
map[")"] = "(";
map["}"] = "{";
map["]"] = "[";
console.log(map);
let stack = [];
for(let s of S){
if(!map[s]){
stack.push(s);
}else{
if(stack.length == 0) return false;
let c = stack.pop();
if(c != map[s]) return false;
}
}
if(stack.length !=0) return false;
return true;
};
이 문제를 해결하는 더 좋은 방법을 알고 있다면 제 설명이 마음에 드셨기를 바라며 공유해 주세요 :)
github : https://github.com/AKHILP96/Data-Structures-and-Algorithms/blob/master/problems/ValidParentheses.js
Reference
이 문제에 관하여(유효한 괄호, Facebook 인터뷰 질문 해결.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/akhilpokle/valid-parentheses-solving-a-facebook-interview-question-410o텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)