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 小时前
【数据结构-树与二叉树】4.6 树与森林的存储-转化-遍历
数据结构
REDcker3 小时前
gRPC开发者快速入门
服务器·c++·后端·grpc
figo10tf3 小时前
Spring Boot项目集成Redisson 原始依赖与 Spring Boot Starter 的流程
java·spring boot·后端
zhangyi_viva3 小时前
Spring Boot(七):Swagger 接口文档
java·spring boot·后端
晚霞的不甘3 小时前
Flutter for OpenHarmony 可视化教学:A* 寻路算法的交互式演示
人工智能·算法·flutter·架构·开源·音视频
望舒5133 小时前
代码随想录day25,回溯算法part4
java·数据结构·算法·leetcode
程序员敲代码吗3 小时前
Spring Boot与Tomcat整合的内部机制与优化
spring boot·后端·tomcat
独好紫罗兰3 小时前
对python的再认识-基于数据结构进行-a006-元组-拓展
开发语言·数据结构·python
C++ 老炮儿的技术栈3 小时前
Qt 编写 TcpClient 程序 详细步骤
c语言·开发语言·数据库·c++·qt·算法
KYGALYX3 小时前
逻辑回归详解
算法·机器学习·逻辑回归