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

相关推荐
寻寻觅觅☆3 小时前
东华OJ-基础题-86-字符串统计(C++)
开发语言·c++·算法
偷吃的耗子3 小时前
【CNN算法理解】:MNIST手写数字识别训练过程
算法·机器学习·cnn
Chef_Chen3 小时前
数据科学每日总结--Day52--Dify使用经验
后端·dify
William_cl3 小时前
ASP.NET路由类型约束核心精讲:[HttpGet (“{id:int}“)] 整数约束吃透,附避坑指南 + 实战代码
后端·asp.net
念越3 小时前
从概念到实现:深入解析七大经典排序算法
java·算法·排序算法
虢薪3 小时前
双向链表与循环链表基础操作&进阶操作
数据结构·链表
寄存器漫游者3 小时前
数据结构 单向链表进阶
数据结构·链表
shilei_c3 小时前
qt qDebug无输出问题解决
开发语言·c++·算法
秋深枫叶红3 小时前
嵌入式C语言阶段复习——函数
c语言·数据结构·算法
2401_841495643 小时前
【Web开发】基于Flask搭建简单的应用网站
后端·python·flask·视图函数·应用实例·路由装饰器·调试模式