leetcode 有效的括号 (java最快实现/python实现)

  我一开始以为可以用回文做,后来发现还是有一点不同的,并不是完全对称的。要想实现O(n)的复杂度,只要遍历一次,我没想到不添加多余空间办法,只是想到正常思路,用时4ms,低于100%的提交记录。
  思路:首先是对偶性,如果不是成对出现,一定是错的,其次会出现一层套一层的情况。那么就想开辟一个空间,遍历整个字符,依次添加到空间中,每一个字符看是否在空间的最后找到另一半,没找到就添加到空间中,找到了,就释放这一对,如果最后空间中还有剩的,要么是多出的单个字符,要么是错开嵌套的字符。

class Solution {
    public boolean isValid(String s) {
        if (s == "") return true;
        char[] arr = s.toCharArray();
        List<Character> ls = new ArrayList<>();
        for (int i = 0; i < arr.length; i ++) {
            if (!ls.isEmpty()) {
                if (charCom(ls.get(ls.size() - 1), arr[i])) {
                    ls.remove(ls.size() - 1);
                    continue;
                }
            }
            ls.add(arr[i]);
        }
        if (ls.isEmpty()) return true;
        else return false;
    }
    
    public boolean charCom(char x, char y) {
        if (x == '(' && y == ')') return true;
        else if (x == '[' && y == ']') return true;
        else if (x == '{' && y == '}') return true;
        else return false;
    }
}

  再用python3实现一遍,发现不是最快,用时52ms,应该是写法的问题,代码如下:

class Solution:
    def isValid(self, s: str) -> bool:
        if (s == ''):
            return True
        arr = list(s)
        ls =[]
        for each in arr:
            if (len(ls)):
                if (Solution.charCom(ls[len(ls) - 1], each)):
                    ls.pop()
                    continue
            ls.append(each)
        if (len(ls) == 0):
            return True
        else:
            return False
    
    def charCom(x, y):
        if (x == '(' and y == ')'):
            return True
        elif (x == '[' and y == ']'):
            return True
        elif (x == '{' and y == '}'):
            return True
        else:
            return False

  较好的python3用时36ms,思路差不多,但是更精炼:

class Solution(object):
    def isValid(self, s):
        if len(s) %2 != 0:
            return False
        lb = {'(':')','[':']','{':'}'}
        stack =[]
        for x in s:
            if x in lb:
                stack.append(x)
            else:
                if len(stack) == 0:
                    return False
                top = stack.pop()
                if lb[top] != x:
                    return False
        return len(stack) == 0
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值