查找有效{}()[]的字符串

时间:2016-04-11 19:40:35

标签: java hashmap stack

如何修复我的代码,以便找到有效的(){} []?现在,它只返回true。

public static boolean isValid(String s){

        HashMap<Character, Character> specialChar= new HashMap<>();
        specialChar.put('{', '}');
        specialChar.put('[',']');
        specialChar.put('(',')');
        Stack<Character> stk = new Stack<>();
        for (int i=0; i<s.length(); i++){

            if (specialChar.keySet().contains(s.charAt(i))){
                stk.push(s.charAt(i));
            }
            else if (specialChar.values().contains(s.charAt(i))){
                if (!stk.empty()) {
                    stk.pop();
                }
            }

        }

        return stk.isEmpty();

    }


 System.out.println(isValid("{}{lll}]"));

4 个答案:

答案 0 :(得分:5)

我在一段时间内制作了这个方法,因为它是关于codewars.com的问题

您有4个条件需要返回false

  • 关闭空Stack的大括号
  • )中关闭Character和顶部Stack不是(
  • }中关闭Character和顶部Stack不是{
  • ]中关闭Character和顶部Stack不是[

    public static boolean isValid(String s) {
        System.out.println(s);
        Stack<Character> st = new Stack<>();
    
        for (int i = 0; i < s.length(); i++) {
            char ch = s.charAt(i);
            if (ch == '(' || ch == '{' || ch == '[') {
                st.push(ch);
            } else if (ch == ')' || ch == '}' || ch == ']') {
                if (st.isEmpty()) {
                    return false;
                }
                char topChar = st.pop();
                if (ch == ')' && topChar != '(') {
                    return false;
                }
                if (ch == '}' && topChar != '{') {
                    return false;
                }
                if (ch == ']' && topChar != '[') {
                    return false;
                }
            }
        }
        return st.isEmpty();
    }
    

    正在运行

    System.out.println(isValid("{}{lll}]"));
    

    收益率:

      

    {} {LLL}]
      假

  • 答案 1 :(得分:2)

    这似乎是一个面试问题,或者确实如此,回到我初次面试的时候。

    您确实拥有固定大小的括号类型 - 三个[]{}(),因此它足以为每个类型保留三个计数器,例如indexerscurliesnormals。在开始时,它们被标准化 - 每个0

    然后用char遍历字符串char。对于每个字符,检查括号类型并增加相应的计数器(如果它是开放的计数器),如果它是关闭计数器则递减。一旦你到达一个负面的计数器,这意味着你已经达到一个结束的计数器,在它们被标准化后,让我们说{} {} },所以你只需要返回false。这是一个无法恢复的错误,您无法打开已经关闭的括号。

    while (indexers >= 0 && curlies >= 0 && normals >= 0) {
        if (char == '}') curlies--;
        if (char == '{') curlies++
        if (char == ')') normals--;
        // ...
    }
    

    主要观点是在循环结束后,所有计数器都为零: - )

    答案 2 :(得分:0)

    sudo sed "s/192[^:]\+ /192.168.56.109/" file
    

    随时提供反馈,评论等!

    答案 3 :(得分:0)

       /**
         * Validate if there balanced brackets in String 
         *
         * @param s is the string to be validated
         * @return true, if is valid
         */
    
        public static boolean isValid(String s)
        {
            /* wrong use of map (because you never said "get value of this key") here, 
             * may be you can create two Set here
             */
            Map<Character, Character> specialChar= new HashMap<Character, Character>(3);
            specialChar.put('{','}');
            specialChar.put('[',']');
            specialChar.put('(',')');
    
            Stack<Character> stk = new Stack<Character>();
            for (int i=0; i<s.length(); i++)
            {
                char c=s.charAt(i);
                if (specialChar.keySet().contains(c))
                {
                    stk.push(s.charAt(i));
                }
                else if (specialChar.values().contains(c))
                {
                    //use equals(),should not use use ==, which works but not right way to do 
                    if (stk.isEmpty() || stk.pop().equals(c)) 
                    {
                        return false;
                    }
    
                }
    
            }
    
            return stk.isEmpty();
        }