LeetCode 32. 最长有效括号

最长有效括号

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

方法一、栈

由于要存在配对,必然有')'存在,配对的长度为上一个')'到当前')'之间的距离,即为最长配对子串,因此,我们使用栈结构,存储上一次配对的')'所在的索引。栈存放**[最后一个没有被匹配的右括号的下标]**

复杂度分析
时间复杂度:O(n),n为字符串的长度,遍历一次
空间复杂度:O(n),n为字符串的长度,栈最多存储n个字符

Swift

func longestValidParentheses(_ s: String) -> Int {
   
        let cnt = s.count
        
        var res:Int = 0
        
        //栈,存放[最后一个没有被匹配的右括号的下标]
        let stack = Stack<Int>()
        stack.push(-1)//为了统一期间,假数据填充

        for i in 0..<cnt {
   
            let chara = s[s.index(s.startIndex, offsetBy: i)]
            if chara == "(" {
   
                stack.push(i)
            }else if(chara == ")") {
   
                let _ = stack.pop()
                
                if stack.count() == 0 {
   
                    stack.push(i)
                }else {
   
                    res = max(res, i - (stack.top() ?? 0))
                }
            }
        }
        return res
    }

OC

- (NSInteger)longestValidParentheses:(NSString *)s {
   
    NSInteger res = 0;
    
    //存放[最后一个没有被匹配的右括号的下标]
    StackOC *stack = [[StackOC alloc] init];
    [stack push:@(-1)];//
    
    for (NSInteger i=0; i<s.length; i++) {
   
        unichar character = [s characterAtIndex:i];
        if (character == '(') {
   
            [stack push:@(i)];
        }else if(character == ')') {
   
            [stack pop];
            
            if ([stack empty]) {
   
                [stack push:@(i)];
            }else {
   
                //当前右括号索引减去上一个右括号的索引,表示最长串
                res = MAX(res, i-[[stack top] integerValue]);
            }
        }
    }
    
    return res;
}

方法二、双指针+双向遍历

思想:left对应 '('个数,right对应')'个数,当两者相等时,说明配对成功。
边界处理:当从左向右遍历时,right>left表示不连续了,要从0开始计数,因此将left和right置为0。
当从右向左遍历时,当left>right时表示不连续了,计数归0

复杂度分析
时间复杂度:O(n),n为字符串的长度,遍历一次
空间复杂度:O(1)

Swift

//双指针法,空间复杂度为O(1)
    func longestValidParentheses(_ s: String) -> Int {
   
        let cnt = s.count
        
        var left = 0, right = 0, maxLen = 0
        
        //从左向右找一次
        for i in 0..<cnt {
   
            let str = s[s.index(s.startIndex, offsetBy: i)]
            if str == "(" {
   
                left += 1
            }else if(str == ")") {
   
                right += 1
            }
            
            if left == right {
   
                maxLen = max(maxLen, 2*right)
            }else if(right > left) {
   
                left = 0
                right = 0
            }
        }
        
        //从右向左找一次
        left = 0; right = 0
        var j = cnt - 1
        while j > 0 {
   
            let str = s[s.index(s.startIndex, offsetBy: j)]
            
            if str == "(" {
   
                left += 1
            }else if(str == ")") {
   
                right += 1
            }
            
            if left == right {
   
                maxLen = max(maxLen, 2*right)
            }else if(left > right) {
   
                left = 0
                right = 0
            }
            
            j -= 1
        }
        
        return maxLen
    }

OC

//双指针+左右遍历
- (NSInteger)longestValidParentheses:(NSString *)s {
   
    NSInteger left = 0, right = 0, maxLen = 0;
    
    //从左向右匹配一次
    for (NSInteger i=0; i<s.length; i++) {
   
        unichar charater = [s characterAtIndex:i];
        if (charater == '(') {
   
            left++;
        }else if(charater == ')') {
   
            right++;
        }
        
        if (left == right) {
   
            maxLen = MAX(maxLen, 2 * right);
        }else if(right > left) {
   
            left = right = 0;
        }
    }
    
    //从右向左匹配一次
    for (NSInteger i=s.length-1; i>0; i--) {
   
        unichar charater = [s characterAtIndex:i];
        if (charater == '(') {
   
            left++;
        }else if(charater == ')') {
   
            right++;
        }
        
        if (left == right) {
   
            maxLen = MAX(maxLen, 2*left);
        }else if(left > right) {
   
            left = right = 0;
        }
    }
    
    return maxLen;
}

相关推荐

  1. LeetCode 32有效括号

    2024-01-10 08:26:02       54 阅读
  2. LeetCode 32. 有效括号

    2024-01-10 08:26:02       47 阅读
  3. LeetCode_32_困难_有效括号

    2024-01-10 08:26:02       46 阅读
  4. leetcode有效括号

    2024-01-10 08:26:02       36 阅读
  5. 【动态规划】Leetcode 32. 有效括号【困难】

    2024-01-10 08:26:02       34 阅读
  6. leetcode热题HOT 32. 有效括号

    2024-01-10 08:26:02       35 阅读
  7. 【算法题】32. 有效括号

    2024-01-10 08:26:02       52 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-10 08:26:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-10 08:26:02       100 阅读
  3. 在Django里面运行非项目文件

    2024-01-10 08:26:02       82 阅读
  4. Python语言-面向对象

    2024-01-10 08:26:02       91 阅读

热门阅读

  1. 二级C语言备考1

    2024-01-10 08:26:02       44 阅读
  2. Kotlin 协程 supervisorScope {} 运行崩溃解决

    2024-01-10 08:26:02       42 阅读
  3. 策略模式--在SpringBoot中的使用

    2024-01-10 08:26:02       48 阅读
  4. img标签的奇怪问题

    2024-01-10 08:26:02       52 阅读
  5. js解决pdf使用iframe打印报跨域错误问题

    2024-01-10 08:26:02       48 阅读
  6. vue element plus Button 按钮

    2024-01-10 08:26:02       67 阅读
  7. python&numpy十二: 使用numpy完成图像处理

    2024-01-10 08:26:02       60 阅读
  8. IOC与DI思想

    2024-01-10 08:26:02       61 阅读
  9. 医疗器械分类及是否需要临床

    2024-01-10 08:26:02       59 阅读
  10. 前端项目由nginx迁移到apache httpd

    2024-01-10 08:26:02       53 阅读
  11. Leetcode 1367. Linked List in Binary Tree (二叉树好题)

    2024-01-10 08:26:02       51 阅读
  12. 笔记:ubuntu22.04重启后无法启动网络

    2024-01-10 08:26:02       64 阅读
  13. nacos和openFeign

    2024-01-10 08:26:02       37 阅读
  14. docker 安装redis集群

    2024-01-10 08:26:02       56 阅读
  15. CPU控制的独立式键盘扫描实验

    2024-01-10 08:26:02       49 阅读