Gemini永久会员 VB返回最长有效子串长度

以下是使用动态规划解决最长有效括号子串长度的VB.NET实现,包含详细注释和示例测试:

vb 复制代码
Imports System

Module Module1
    Function LongestValidParentheses(s As String) As Integer
        Dim n As Integer = s.Length
        If n <= 1 Then Return 0
        
        Dim dp(n - 1) As Integer ' dp(i)表示以s(i)结尾的最长有效括号长度
        Dim maxLen As Integer = 0
        
        For i As Integer = 1 To n - 1
            If s(i) = ")"c Then
                If s(i - 1) = "("c Then
                    ' 情况1:形如 "...()"
                    dp(i) = If(i >= 2, dp(i - 2), 0) + 2
                Else
                    ' 情况2:形如 "...))"
                    Dim prevLen As Integer = dp(i - 1)
                    Dim prevStart As Integer = i - prevLen
                    If prevStart > 0 AndAlso s(prevStart - 1) = "("c Then
                        dp(i) = dp(i - 1) + 2
                        ' 如果前面还有有效序列,可以合并
                        If prevStart - 2 >= 0 Then
                            dp(i) += dp(prevStart - 2)
                        End If
                    End If
                End If
                maxLen = Math.Max(maxLen, dp(i))
            End If
            ' 如果是'(',dp(i)保持为0
        Next
        
        Return maxLen
    End Function
    
    ' 优化空间版本(使用栈的思想,但保持DP解法)
    Function LongestValidParenthesesOptimized(s As String) As Integer
        Dim n As Integer = s.Length
        Dim dp(n - 1) As Integer
        Dim maxLen As Integer = 0
        
        For i As Integer = 1 To n - 1
            If s(i) = ")"c Then
                If s(i - 1) = "("c Then
                    dp(i) = If(i >= 2, dp(i - 2), 0) + 2
                Else
                    Dim len As Integer = dp(i - 1)
                    If i - len > 0 AndAlso s(i - len - 1) = "("c Then
                        dp(i) = dp(i - 1) + 2 + If(i - len - 2 >= 0, dp(i - len - 2), 0)
                    End If
                End If
                maxLen = Math.Max(maxLen, dp(i))
            End If
        Next
        
        Return maxLen
    End Function

    Sub Main()
        Dim testCases() As String = {
            "(()",       ' 2
            ")()())",    ' 4
            "",          ' 0
            "()(())",    ' 6
            "()(()",     ' 2
            "((()))()",  ' 8
            "()((())"    ' 6
        }
        
        For Each s As String In testCases
            Console.WriteLine("Input: """ & s & """")
            Console.WriteLine("Output: " & LongestValidParentheses(s))
            Console.WriteLine("Optimized Output: " & LongestValidParenthesesOptimized(s))
            Console.WriteLine()
        Next
    End Sub
End Module

关键点说明:

  1. 动态规划定义

    • dp(i) 表示以 s(i) 结尾的最长有效括号子串长度
    • 初始化全为0,因为只有遇到)才可能形成有效子串
  2. 两种情况处理

    • 情况1...()
      • s(i) = ")"s(i-1) = "("时,直接形成新配对
      • 长度 = 前前位置的值 + 2
    • 情况2...))
      • s(i) = ")"s(i-1) = ")"时,需要检查是否能与更前面的(配对
      • 计算前一个有效长度prevLen = dp(i-1)
      • 检查s(i-prevLen-1)是否是(
  3. 边界处理

    • 访问dp(i-2)dp(prevStart-2)时要确保索引不越界
    • 空字符串或单字符字符串直接返回0
  4. 优化空间

    • 第二个实现是空间优化版本,但保持了相同的DP思路

复杂度分析:

  • 时间复杂度:O(n)(单次遍历字符串)
  • 空间复杂度:O(n)(DP数组)

示例输出:

复制代码
Input: "(()"
Output: 2
Optimized Output: 2

Input: ")()())"
Output: 4
Optimized Output: 4

Input: ""
Output: 0
Optimized Output: 0

Input: "()(())"
Output: 6
Optimized Output: 6

Input: "()(()"
Output: 2
Optimized Output: 2

Input: "((()))()"
Output: 8
Optimized Output: 8

Input: "()((())"
Output: 6
Optimized Output: 6

这个VB.NET实现正确处理了各种边界情况,包括嵌套括号和连续有效子串的合并,与C/C++版本逻辑完全一致。

相关推荐
学废了wuwu2 小时前
从入门到实战:深入浅出模型压缩三大核心——剪枝、彩票假设与知识蒸馏
人工智能·算法·剪枝
小肝一下2 小时前
3. 单链表
c语言·数据结构·c++·算法·leetcode·链表·dijkstra
劈星斩月2 小时前
监督学习算法 之 决策树
学习·算法·决策树
卷无止境2 小时前
Python 异常处理:从入门到工程实践
后端·python
AINative软件工程2 小时前
LLM 应用的熔断降级工程实践:Circuit Breaker 不只是重试的升级版
后端·llm·ai编程
学计算机的计算基2 小时前
操作系统内存管理全解:虚拟内存、页表、COW、malloc、OOM一篇搞定
java·笔记·算法
tachibana22 小时前
hot100 前 K 个高频元素(347)
java·数据结构·算法·leetcode
程序员爱钓鱼3 小时前
Go 开发环境安装(Windows、macOS、Linux)
后端·面试·go
程序员爱钓鱼3 小时前
Rust String 与 &str 详解:字符串所有权、借用与转换
前端·后端·rust
To_OC10 小时前
LC 131 分割回文串:刚学回溯时,我连怎么切字符串都想不明白
javascript·算法·leetcode