swift - 如何改进检查括号是否平衡的程序?

标签 swift data-structures stack

我写了一个示例程序来检查括号是否平衡。我试图优化它,这是我能想到的最好的。但是,我正在寻找我们是否可以进一步改进这一点。我也不确定这是否是放在 stackoverflow 上的有效问题。任何想法和建议

func checkBalancedParenthesis(parenthesis: String) -> (Bool,String) {

    var stack = Stack<Character>()

    for character in parenthesis.characters {

        guard let check = try? checkValidPattern(a: ("!",character)) else {

            return (false,"Pattern is not valid")
        }

        if let elem = stack.top, try! checkValidPattern(a: (elem,character)) {

            stack.pop()

        }
        else {
            stack.push(item: character)
        }
    }

    return (stack.isEmpty,stack.isEmpty ? "Balanced": "Un-Balanced")

}


func checkValidPattern(a: (Character,Character)) throws -> Bool {
    let validList: [Character] = ["(",")","[","]","}","{","<",">"]

    switch a
    {
    case ("(",")"):
        return true
    case ("[","]"):
        return true
    case ("{","}"):
        return true
    case ("<",">"):
        return true
    case let (_,char) where validList.contains(char) == true:
            return false
    default:
        throw InvalidPattern.chracterNotValid
    }
}

最佳答案

可能是我的解决方案对某人有用。检查支架的平衡或不只是它们。 func 接受带有匹配字符(或字符串,如果需要)大小写的字符串和字典,并返回 isBalanced(Bool)。 swift 3(4)

对于 Swift 4:“str.characters”替换为“str”。

这是它:

func isBalanced(str: String, dictAccordance: [Character : Character]) -> Bool {
    var balArr: [Character] = []

    let keys = dictAccordance.keys // all keys (opening characters)
    let values = dictAccordance.values // all values (closing characters)

    for char in str.characters {

        switch char {
            // met char from keys. (Met opening character)
        case (let key) where keys.contains(char):
            balArr.append(key)

            // met char from values. (Met closing character)
        case (let value) where values.contains(char):
            let lastOpenedCharKey = balArr.removeLast() // key  of char
            // check last matching
            if dictAccordance[lastOpenedCharKey] != value {
                return false
            }
        default:
            break
        }
    }

    return balArr.isEmpty
}

用法:

override func viewDidLoad() {
    super.viewDidLoad()

    let dictAccordance: [Character : Character] = [
        "(" : ")",
        "[" : "]",
        "{" : "}",
        "<" : ">"  // put dict whatever you want
    ]

    let test1 = isBalanced(str: "sdvs", dictAccordance: dictAccordance)
    let test2 = isBalanced(str: "()", dictAccordance: dictAccordance)
    let test3 = isBalanced(str: "[]<<>>", dictAccordance: dictAccordance)
    let test4 = isBalanced(str: "kn(jdnsv;)ds[svds]dvs", dictAccordance: dictAccordance)
    let test5 = isBalanced(str: "(dacadc[])", dictAccordance: dictAccordance)
    let test6 = isBalanced(str: "([) ewf]", dictAccordance: dictAccordance)
    let test7 = isBalanced(str: "[ (()]", dictAccordance: dictAccordance)

    let arrTest = [test1, test2, test3, test4, test5, test6, test7]

    print(arrTest)
}

关于swift - 如何改进检查括号是否平衡的程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45767255/

相关文章:

algorithm - 遍历对象 2 值以查找它是否与对象 1 最小变量匹配

algorithm - 使用相同队列对队列进行排序

c++ - 如何获得gcc编译的每个函数的最大帧大小?

ios - 打开APP时后台音乐停止播放

ios - IQKeyboard 未在堆栈 View 中显示下一个/上一个选项

c++ - 以 O(log(n)) 复杂度改变二叉堆元素的优先级

graph - 如何使用 amchart 堆叠图表?

c++ - 在 8 字节边界上对齐 double ?

string - 我如何确定调用 `String.Index.advancedBy` 不会导致崩溃?

ios - Swift 以编程方式设置 View 约束错误日志