Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
解决问题:Java中的有效括号字符串_Java - Fatal编程技术网

解决问题:Java中的有效括号字符串

解决问题:Java中的有效括号字符串,java,Java,我正在尝试从LeetCode实现以下程序 给定仅包含字符“(”、“)”、“{”、“}”、“[”和“]”的字符串s,确定输入字符串是否有效。 输入字符串在以下情况下有效: 开放式括号必须由相同类型的括号封闭 必须按照正确的顺序关闭开放式支架 我已经编写了以下代码。它可以运行86/91个测试用例。为了让所有的测试用例都运行,我应该在代码中更改什么 class Solution { public boolean isValid(String s) { char a[] = n

我正在尝试从LeetCode实现以下程序

给定仅包含字符“(”、“)”、“{”、“}”、“[”和“]”的字符串s,确定输入字符串是否有效。 输入字符串在以下情况下有效:

  • 开放式括号必须由相同类型的括号封闭
  • 必须按照正确的顺序关闭开放式支架
  • 我已经编写了以下代码。它可以运行86/91个测试用例。为了让所有的测试用例都运行,我应该在代码中更改什么

    class Solution {
        public boolean isValid(String s) {
            char a[] = new char[10000];
            int j=0, flag = 0;
            char pop='a';
            
            for(int i = 0 ; i<s.length() ; i++)
            {
                if(s.charAt(0)=='(' || s.charAt(0)=='[' || s.charAt(0)=='{')
                {
                    
                }
                else
                {
                    return false;
                }
    
                if(s.length()%2==0)
                {
                    
                }
                else
                {
                    return false;
                }
                
                if(s.charAt(i)=='(' || s.charAt(i)=='[' || s.charAt(i)=='{')
                {
                    if(j<0)
                    {
                        j=0;
                    }
                    a[j]=s.charAt(i);
                    j++;
                }
                else if(s.charAt(i)==')' || s.charAt(i)==']' || s.charAt(i)=='}')
                {
                    try
                    {
                        pop = a[j-1];
                    }
                    catch(Exception e)
                    {
                        
                    }                
                    j=j-2;
                    
                    if(s.charAt(i)==')')
                    {
                        if(pop=='(')
                        {
                            flag=1;
                        }
                    }
                    else if(s.charAt(i)==']')
                    {
                         if(pop=='[')
                        {
                            flag=1;
                        }
                    }
                    else if(s.charAt(i)=='}')
                    {
                        if(pop=='{')
                        {
                            flag=1;
                        }
                    }
                    
                    if(flag == 1)
                    {
                        
                    }
                    else
                    {
                        return false;
                    }
                }
            }
            
            if(j<0)
            {
                return true;
            }
            else
            {
                return false;
            }
        }
    }
    
    类解决方案{
    公共布尔值无效(字符串s){
    字符a[]=新字符[10000];
    int j=0,flag=0;
    charpop='a';
    
    对于(inti=0;i,正如@Koenigsberg在他的文章中所说的,使用a来实现解决方案似乎是合适的

    import java.util.EmptyStackException;
    导入java.util.Stack;
    公共类解决方案{
    私有静态最终字符CURLY='{';
    私有静态最终字符CURLY_CLOSE='}';
    私有静态最终字符轮='(';
    private static final char ROUND_CLOSE=');
    私有静态最终字符平方='[';
    私有静态最终字符平方_CLOSE=']';
    私有静态布尔isCloser(字符开启器、字符关闭器){
    返回开关(开启器){
    case CURLY->closer==CURLY\u CLOSE;
    案例圆形->闭合==圆形\闭合;
    方格->闭合==方格\闭合;
    默认->假;
    };
    }
    私有静态布尔等参元(char-ch){
    返回ch==卷曲| | ch==圆形| | ch==正方形;
    }
    私有静态布尔值isValid(字符串输入){
    布尔有效=真;
    堆栈=新堆栈();
    对于(int i=0;i
    请注意,上述代码中的方法
    isCloser
    ,使用了JDK12中引入的方法

    运行上述代码将生成以下输出:

    true:()
    true:()[]{}
    错:(]
    错:([)]
    真:{[]}
    false:({{{}}}))
    
    编辑 根据OP在下面a中的要求,这里是
    char
    s堆栈的实现。只需将上述代码中的
    stack
    替换为
    CharStak

    class CharStak{
    专用静态最终整数大小=100;
    私有字符[]字符;
    私人整数计数;
    公共CharStak(){
    charr=新字符[大小];
    }
    公共布尔空(){
    返回计数==0;
    }
    公共字符peek(){
    checkEmpty();
    返回字符[计数-1];
    }
    公共字符pop(){
    checkEmpty();
    返回字符[--count];
    }
    公共无效推送(char ch){
    charr[count++]=ch;
    }
    私有void checkEmpty(){
    if(空()){
    抛出新的EmptyStackException();
    }
    }
    }
    
    Unrelated:如果你把你的保护检查转过来,你的代码就更容易阅读了。意思是:不要用“if X then nothing return false”,而是用“if!X then return false”。你也可以把所有有效字符分为两组(一组用于打开,一组用于关闭括号)。绝对要避免的事情是:有空的catch块。你的“pop”很可能会导致一个异常,然后被完全忽略。永远不要这样做。至少要打印异常,尤其是在不应该抛出的代码中,让它们发生,然后修复它们!
    j=j-2
    对于“pop”来说似乎是非常错误的操作。当将一个字符推到堆栈上时,将一个字符添加到
    j
    ;当弹出一个后退时,为什么不减去一个呢?我觉得这可能是
    堆栈的完美方案。因此,每推一个左括号向前一步,但每弹出一个右括号向后两步?这没有意义。谢谢s、 我使用了一个数组来实现堆栈。你能再次查看我的解决方案吗?@AnwesaRoy on leetcode也使用class
    java.util.stack
    。你是否试图实现自己的堆栈而牺牲了找到问题的有效解决方案?是的,我正在尝试使用数组来实现堆栈。该程序不会遇到任何问题任何“执行超时”执行它的测试用例的错误占测试用例的90%以上。因此,我猜可能会使用数组来解决此问题。@AnwesaRoy我不打算调试您的代码,有调试程序。每个程序员都需要学习如何调试代码。您的IDE应该有一个调试程序。学习如何使用它。您能告诉我“({{}}}}”)吗是否为有效字符串?.LeetCode将“({{{}}}”)显示为无效字符串。谢谢。