拼多多二面笔试原题,15分钟没做出来,直接挂了。。。

d8261dbebaae655c5eab91bdbc34caea.gif

(关注数据结构和算法,了解更多新知识)

刷题的时候在评论区看到有这样一条留言,一网友在拼多多笔试面试的时候遇到过这道题,由于之前没做过,结果没写出来,最后直接挂了。而这题就是LeetCode的第32题:最长有效括号。

d82e4b06619f96148972fe6e57773b89.png

这题除了拼多多考过以外,网易,字节,华为,腾讯等大厂都考过,我们来看下这究竟是一道什么样的题,竟如此受这么多大厂的青睐。

40ee203ca700e6fc741eab5b5bb2bdff.png

问题描述

来源:LeetCode第32题

难度:困难

给你一个只包含 '(' 和 ')' 的字符串,找出最长有效(格式正确且连续)括号子串的长度。

示例1:

输入:s = "(()"

输出:2

解释:最长有效括号子串是 "()"

示例2:

输入:s = ")()())"

输出:4

解释:最长有效括号子串是 "()()"

  • 0 <= s.length <= 3 * 10^4

  • s[i] 为 '(' 或 ')'

问题分析

对于括号的匹配问题,我们最容易想到的就是使用栈stk,在开始的时候我们需要添加一个标志位,这个标志位表示当前位置及之前的字符不能再和后面的匹配了。

在最开的时候我们添加标志位为 -1 ,比如前面 4 个字符如果都是有效的括号,那么第 4 个字符的下标是 3(下标是从 0 开始的),让他减去标志位的值正好等于 4 。

然后我们遍历字符串中的所有字符,如果遇到左括号我们就把它的下标 i 压入到栈中。

如果遇到右括号,栈顶元素出栈,出栈之后如果栈不为空,那么当前右括号和出栈的括号是匹配的,以当前右括号为最右边的有效括号长度就是 i - stk.peek() ,我们计算并保存最大值即可。

出栈之后如果栈为空,当前右括号是没法匹配的,我们把他的下标 i 压入到栈中,他就变成了标志位,我们画个图看下。

c3e4b3a641dafc11437e257df21b5160.png

JAVA:

public int longestValidParentheses(String s) {
    int max = 0;// 记录最大长度
    Stack<Integer> stack = new Stack<>();// 栈
    stack.push(-1);// 先把-1压栈
    for (int i = 0; i < s.length(); i++) {
        if (s.charAt(i) == '(') {
            stack.push(i);// 遇到左括号,下标压栈
        } else {
            stack.pop();// 遇到右括号,栈顶元素先出栈。
            if (stack.empty()) {// 如果栈为空,把这个右括号的下标压栈。
                stack.push(i);
            } else {// 计算长度,保存最大值。
                max = Math.max(max, i - stack.peek());
            }
        }
    }
    return max;
}

C++:

public:
    int longestValidParentheses(string s) {
        int ans = 0;// 记录最大长度
        stack<int> stk;// 栈
        stk.push(-1);// 先把-1压栈
        for (int i = 0; i < s.length(); i++) {
            if (s[i] == '(') {
                stk.push(i);// 遇到左括号,下标压栈
            } else {
                stk.pop();// 遇到右括号,栈顶元素先出栈。
                if (stk.empty()) {// 如果栈为空,把这个右括号的下标压栈。
                    stk.push(i);
                } else {// 计算长度,保存最大值。
                    ans = max(ans, i - stk.top());
                }
            }
        }
        return ans;
    }

C:

int longestValidParentheses(char *s) {
    int ans = 0;// 记录最大长度
    int *stk = malloc(30000 * sizeof(int));// 栈
    int index = 0;
    stk[index++] = -1;// 先把-1压栈
    for (int i = 0; i < strlen(s); i++) {
        if (s[i] == '(') {
            stk[index++] = i;// 遇到左括号,下标压栈
        } else {
            index--;// 遇到右括号,栈顶元素先出栈。
            if (index == 0) {// 如果栈为空,把这个右括号的下标压栈。
                stk[index++] = i;
            } else {// 计算长度,保存最大值。
                ans = fmax(ans, i - stk[index - 1]);
            }
        }
    }
    return ans;
}

Python:

def longestValidParentheses(self, s: str) -> int:
    ans = 0  # 记录最大长度
    stk = [-1]  # 先把 -1 压栈
    for i, ch in enumerate(s):
        if ch == '(':
            stk.append(i)  # 遇到左括号,下标压栈
        else:
            stk.pop()  # 遇到右括号,栈顶元素先出栈。
            if not stk:  # 如果栈为空,把这个右括号的下标压栈。
                stk.append(i)
            else:  # 计算长度,保存最大值。
                ans = max(ans, i - stk[-1])
    return ans

7914284535c466f93fd805cc58fa16b3.gif

笔者简介

博哥,真名:王一博,毕业十多年,《算法秘籍》作者,专注于数据结构和算法的讲解,在全球30多个算法网站中累计做题2000多道,在公众号中写算法题解800多题,对算法题有自己独特的解题思路和解题技巧,喜欢的可以给个关注,也可以下载我整理的1000多页的PDF算法文档。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

数据结构和算法

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值