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++版本逻辑完全一致。

相关推荐
Evand J1 分钟前
【电机滤波例程1】PMSM永磁同步电机转速与位置估计,MATLAB程序:标准无迹卡尔曼滤波、模型说明与仿真验证
算法·matlab·电机·ekf·负载·卡尔曼滤波
松就是我9029817 分钟前
如何设计多Agent
后端
打码的老程是远篁19 分钟前
手把手教你玩转大模型——3. Transformer 的位置编码——模型怎么知道谁在前,谁在后?
人工智能·算法
嘎嘎风20 分钟前
MiniMind 学习笔记之 06 一张图、一百行:MiniMind 的骨架
算法·源码
高频因子挖掘机21 分钟前
盘中筛选要同时看价格和盘口?按需分层比“一次全拿”更好维护
后端·github·api
用户73416810354823 分钟前
只盯被动响应做状态监测?论“控制信号”在变工况故障诊断中的重要作用
算法
asong25 分钟前
从写代码到部署上线,Cloudflare 给 AI 配了一把新钥匙
前端·javascript·后端
Ivanqhz26 分钟前
MQA、GQA、稀疏/滑动窗口注意力及混合范式
人工智能·算法·机器学习
RobinDevNotes26 分钟前
PagedAttention原理,KV缓存也能分页
人工智能·后端
卷无止境27 分钟前
当AI写代码遇见Rust为什么会卡壳
后端·python