Untitled
unknown
typescript
a year ago
2.5 kB
10
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