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

相关推荐
墨尘笔尖10 小时前
最大最小值降采样算法的优化
c++·算法
2401_8955213410 小时前
【Spring Security系列】Spring Security 过滤器详解与基于JDBC的认证实现
java·后端·spring
小码哥_常11 小时前
大文件上传不再卡顿:Spring Boot 分片上传、断点续传与进度条实现全解析
后端
_Evan_Yao11 小时前
RAG中的“Chunk”艺术:我试过10种切分策略后总结的结论
java·人工智能·后端·python·软件工程
自我意识的多元宇宙11 小时前
二叉树的遍历和线索二叉树--二叉树的遍历
数据结构
今天你TLE了吗11 小时前
LLM到Agent&RAG——AI概念概述 第二章:提示词
人工智能·笔记·后端·学习
qq_50242899012 小时前
清华大学与微软亚洲研究院出品:Kronos 本地部署教程
数据结构·python·金融量化·kronos开源模型
white-persist12 小时前
【vulhub shiro 漏洞复现】vulhub shiro CVE-2016-4437 Shiro反序列化漏洞复现详细分析解释
运维·服务器·网络·python·算法·安全·web安全
IT_陈寒12 小时前
Vue的响应式把我坑惨了,原来问题出在这
前端·人工智能·后端
shark222222213 小时前
能懂!基于Springboot的用户增删查改(三层设计模式)
spring boot·后端·设计模式