Codility Brackets挑战性能问题

时间:2015-03-02 14:59:32

标签: java performance algorithm implementation

尝试一个简单的编码挑战(检查一串{}字符是否格式良好)我已经因为我的解决方案性能得分很差甚至超过他们的一些测试用例而陷入困境。 / p>

规范是“如果结构良好则返回1,否则返回0”:

class Solution {
public int solution(String S) {

    Deque<String> stack = new LinkedList<String>();
    while (S.length() > 0) {
        String firstChar = S.substring(0, 1);
        if (isOpenBracket(firstChar)) {
            stack.addFirst(firstChar);
        }
        else {
            String matchingOpen = closedToOpen(firstChar);
            if (matchingOpen == null) return 0;

            String topOfStack = stack.pollFirst();
            if (!matchingOpen.equals(topOfStack)) {
                return 0;
            }
        }
        S = S.substring(1);
    }
    return stack.isEmpty() ? 1 : 0;
}

public boolean isOpenBracket(String s) {
    return ("{".equals(s) || "[".equals(s) || "(".equals(s));
}

public String closedToOpen(String closed) {
    if ("}".equals(closed)) return "{";
    if ("]".equals(closed)) return "[";
    if (")".equals(closed)) return "(";
    return null;
}
}

起初我认为罪魁祸首是addFirst / pollFirst实际上附加在链表的远端,但情况并非如此(更改为添加/ pollLast实际上会产生相同的得分配置文件。)

我可以看到使用chars而不是字符串会加快速度,但我认为它不足以使测试超时(预期时间<3秒,运行时间> 8秒)... < / p>

我的最后一个猜测是,helpers方法会在每次调用时重新分配常量......但是,这是否会产生如此大的影响?

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

问题是调用长度为n的字符串的子字符串成本为O(n),因为它会复制。不要经常复制字符串,而是希望保留一个字符串并访问每个字符。