Untitled

 avatar
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