从codility来的问题描述:

如果满足以下任一条件,则认为由N个字符组成的字符串S是正确嵌套的:

S为空;
S的格式为“(U)”或“[U]”或“{U}”,其中U是正确嵌套的字符串;
S的形式为“VW”,其中V和W是正确嵌套的字符串。
例如,字符串“{[()()]}”已正确嵌套,而“([]()]”则未正确嵌套。

编写一个函数:

类Solution {public int solution(String S); }

给定一个由N个字符组成的字符串S,如果正确嵌套了S,则返回1,否则返回0。

例如,如上所述,给定S =“{[(((((())]}}),该函数应返回1,给定S =”([]()]]“,该函数应返回0)。

假使,假设:

N是[0..200,000]范围内的整数;
字符串S仅由以下字符组成:“(”,“{”,“[”,“]”,“}”和/或“)”。
复杂:

预期的最坏情况下的时间复杂度为O(N);
预期的最坏情况下的空间复杂度为O(N)(不计算输入参数所需的存储空间)。

我得到了87%,我似乎无法找出问题所在。

这是我的代码:

   // you can also use imports, for example:
// import java.util.*;
import java.util.Stack;
// you can use System.out.println for debugging purposes, e.g.
// System.out.println("this is a debug message");

class Solution {
   public int solution(String s) {

        if (s.length() % 2 != 0) {
            return 0;
        }

        Character openingBrace = new Character('{');
        Character openingBracket = new Character('[');
        Character openingParen = new Character('(');
        Stack<Character> openingStack = new Stack<Character>();

        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            if (c == openingBrace || c == openingBracket || c == openingParen) {
                openingStack.push(c);
            } else  {
                if (i == s.length()-1 && openingStack.size() != 1) {
                    return 0;
                }
                if (openingStack.isEmpty()) {
                    return 0;
                }
                Character openingCharacter = openingStack.pop();
                switch (c) {
                case '}':
                    if (!openingCharacter.equals(openingBrace)) {
                        return 0;
                    }
                    break;
                case ']':
                    if (!openingCharacter.equals(openingBracket)) {
                        return 0;
                    }
                    break;
                case ')':
                    if (!openingCharacter.equals(openingParen)) {
                        return 0;
                    }
                    break;

                default:
                    break;
                }
            }
        }

        return 1;

    }
}

最佳答案

在右方括号块中的第一个条件是检查堆栈是否具有!= 1的大小。我认为这是为了检查您是否没有剩余的左方括号,这是一个好主意。但是,如果您的最后一个字符不是右括号/括号/,您将错过整个检查。

例如,这对于诸如(((的输入将失败。

一个简单的解决方法是,在循环结束后通过检查堆栈确实为空来替换此条件。

关于java - Codility : Brackets Determine whether a given string of parentheses is properly nested,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28951336/

10-10 02:26