Untitled
unknown
typescript
5 months ago
2.5 kB
3
Indexable
enum EBracketStates { NO, ROUND, CURLY, SQUARE } type TOpenBracket = '[' | '{' | '(' const OPEN_BRACKETS = [ '[', '{' ,'('] type TClosedBracket = ']' | '}' | ')' const CLOSED_BRACKET = [']' , '}' ,')'] type TBrackets = TOpenBracket | TClosedBracket function isOpenBracket(value:TBrackets): value is TOpenBracket { return OPEN_BRACKETS.includes(value) } function getStateByBracket(curState:EBracketStates, bracket: TBrackets) { switch (curState) { case EBracketStates.NO: if (isOpenBracket(bracket)) { return getStateByOpenBracket(bracket) } throw new Error('parsing error') case EBracketStates.CURLY: case EBracketStates.ROUND: case EBracketStates.SQUARE: if(isOpenBracket(bracket)) return getStateByOpenBracket(bracket) else { if(isCorrectClosingBracket(curState, bracket)) return EBracketStates.NO throw new Error('parsing error') } } } function getStateByOpenBracket(bracket: TOpenBracket) { switch (bracket) { case '{': return EBracketStates.CURLY case '[': return EBracketStates.SQUARE case '(': return EBracketStates.ROUND } } function isCorrectClosingBracket(state:EBracketStates, bracket: TClosedBracket) { switch(state){ case EBracketStates.NO: return false case EBracketStates.CURLY: return bracket==='}' case EBracketStates.ROUND: return bracket===')' case EBracketStates.SQUARE: return bracket===']' } } function isValid(s: string): boolean { let prevState = EBracketStates.NO let currentState = EBracketStates.NO let pointer = 0 const statesHistory:EBracketStates[] = [EBracketStates.NO] try { while(pointer<s.length) { const currentChar = s[pointer] as TBrackets const newState = getStateByBracket(statesHistory[statesHistory.length-1], currentChar) if(newState===EBracketStates.NO) { statesHistory.pop() } else { statesHistory.push(newState) } debugger pointer++ } } catch(e) { debugger return false } return statesHistory.length===1 && statesHistory[0] === EBracketStates.NO };
Editor is loading...
Leave a Comment