Leetcode

leetcode 20 有效的括号

2018-05-21  本文已影响0人  34码的小孩子

思路:

一个符号数组,["{", "[", "(", "}", "]", ")"]一个栈。

实现:

swift 没有栈,需要用数组实现一个:

struct Stack<T> {
    // 对数组进行初始化
    fileprivate var array = [T]()
    
    public var isEmpty: Bool {
        return array.isEmpty
    }
    
    public var count: Int {
        return array.count
    }
    
    public mutating func push(_ element: T) {
        array.append(element)
    }
    
    public mutating func pop() -> T? {
        // 数组不为空时,返回并移除最后一个元素;空时,返回nil
        return array.popLast()
    }
    
    public var top: T? {
        //数组不为空时,返回最后一个元素;空时,返回nil
        return array.last
    }
}

// 判断符号是否成对匹配
func isValid(_ s: String) -> Bool {
    let charArray = Array(s)
    let symbelArray : [Character] = ["{", "[", "(", "}", "]", ")"]
    var stackStr = Stack<Character>()
    
    for item in charArray {
        if let index = symbelArray.index(of: item) {
            if index < 3 {
                // 如果是左括号,则进栈
                stackStr.push(item)
            }
            else {
                // 右括号
                if stackStr.isEmpty {
                    // 栈中没有元素,则不可能匹配
                    return false
                }
               
                // 如果栈中有元素,则拿栈顶元素匹配
                if let top = stackStr.top as? Character {
                    if symbelArray[index - 3] != top {
                        // 栈顶元素不匹配
                        return false
                    }
                    
                    // 栈顶元素匹配成功,则继续进行。
                    stackStr.pop()
                }
            }
        }
    }
    
    // 所有右边的括号都匹配了,如果栈还有元素,说明还有左括号没有匹配成功。
    return stackStr.isEmpty
}

上一篇下一篇

猜你喜欢

热点阅读