平衡括号问题的优化解决方案

时间:2019-07-19 18:11:14

标签: java optimization stack

给出一个仅包含字符')''{''}''['']'Input: "()[]{}" Output: true Example 2: 的字符串,确定输入是否字符串有效。

在以下情况下,输入字符串有效:

  1. 开放式括号必须用相同类型的括号封闭。
  2. 方括号必须以正确的顺序闭合。
  3. 请注意,空字符串也被视为有效。

示例1:

Input: "{[(])}"
Output: false

示例2:

static boolean isPair(char left,char right){
        return left=='{' && right=='}' || left=='(' && right==')' || left=='[' && right==']'; 
    }
    public boolean isValid(String s) {
        Stack<Character> stack= new Stack<>();
        for(char ch: s.toCharArray()){
            if(ch=='(' || ch=='{' || ch=='['){
                stack.push(ch);
            }
            else{
                if(!stack.isEmpty() && isPair(stack.peek(),ch))
                    stack.pop();
                else
                    return false;
            }
        }
        return stack.isEmpty();
}

我针对上述问题的解决方案是:

public boolean isValid(String s) {
        Stack<Character> stack= new Stack<>();
        for(char ch: s.toCharArray()){
            if(ch=='(')
                stack.push(')');
            else if(ch=='{')
                stack.push('}');
            else if(ch=='[')
                stack.push(']');
            else if(stack.isEmpty() || stack.pop()!=ch)
                return false;
        }
        return stack.isEmpty();
}

我在某处找到了一个更智能的解决方案,但无法理解。 这是代码:

else-if

请帮助我了解最后$imgPath = "\images\Progressiva_Itaipu.jpg"; $cid = md5($imgPath); $mail->AddEmbeddedImage($imgPath,$cid,'Progressiva_Itaipu.jpg'); 块的工作原理。

2 个答案:

答案 0 :(得分:2)

您已将closing bracket的所有括号都推入opening。因此,当右括号出现时,它将匹配堆栈顶部的字符。如果不匹配或堆栈变为空。这意味着不平衡

else if(stack.isEmpty() || stack.pop()!=ch)
    return false;

到达此处时,您有一个bracket作为ch,但是堆栈为空,或者堆栈中的值与传入的字符不匹配。

因此,这些寄生虫不平衡

答案 1 :(得分:0)

它实际上与您自己的版本非常相似。

主要区别在于,将方括号推入堆栈,然后在public static void Main(string[] args) { CreateWebHostBuilder(args) .ConfigureLogging(context => { // define additional logging providers // get environment via `context.HostingEnvironment` }).Build().Run(); 中检查堆栈顶部的方括号是否与您当前正在评估的结束括号相符。

该解决方案通过将预期的右方括号直接推入堆栈来跳过它,但是在功能上是相同的。

最后一个isPair与您的if else完全相同:

  1. 如果else返回false
  2. 如果不为空且与堆栈顶部的括号不匹配,则返回false
  3. 否则,将支架弹出顶部

在情况2中,解决方案会弹出堆栈,而在您的情况下您不会弹出堆栈,这有一点差异。但是随着函数的返回它不会改变任何东西,并且该堆栈将不再使用。