Longest Valid Parentheses

本文介绍两种高效算法来寻找给定字符串中最长的有效括号子串长度。第一种算法通过两次遍历并使用指针记录子串边界,第二种算法则利用栈结构标记匹配的括号,最终遍历字符串找出最长连续匹配部分。

题目

Given a string containing just the characters '(' and ')', find the length of the longest valid (well-formed) parentheses substring.

For "(()", the longest valid parentheses substring is "()", which has length = 2.

Another example is ")()())", where the longest valid parentheses substring is "()()", which has length = 4.

思路一

(1)先将 string 转化为更容易操作的数组,'(' 是1,  ')' 是-1;

(2)用 left 和 right 指针记录最大长度的子串左右边界,并用sum记录当前的和:

          如果sum==0,表示已经匹配,更新最大值 max = max>(right+1-left)?max:(right+1-left) ;

          如果sum>0,表示未匹配,需要右移 right ;

          如果sum<0,表示匹配过当,需要将左边界 left 更新至 right+1 的位置;

(3)当然会出现结束时sum>0的情况,例如 ( ( ( ) ( ) ) ,遍历结束时sum=1,left=0,right=7,始终都未更新max。

          这是就需要一个翻转操作,即将结束时 left~rght-1的字符串翻转(位置和值同时翻转),再接着遍历left~rght-1,更新max。

(4)具体实现时,只需要两遍遍历即可:从前到后 maxLR ,从后到前 maxRL ,再取两者最大值,即为结果。

 

class Solution {
public:
    int longestValidParentheses(string s) {
        // Start typing your C/C++ solution below
        // DO NOT write int main() function
        int len = s.length();
        if(len<2)  return 0;
        vector<int> value(len,0);
        for(int i=0;i<len;i++) {
            if(s[i]=='(') value[i]=1;
            if(s[i]==')') value[i]=-1;
        }       
        int maxLR = maxlenLR(value); 
        int maxRL = maxlenRL(value);
        return max(maxLR,maxRL);        
    }
    
    int maxlenLR(vector<int> &value) {
        int sum=0;
        int max = 0;
        int left=0,right=0;
        while(right<value.size()) {
            sum+=value[right];
            if(sum<0) {
                if(right-left>max)
                    max=right-left;
                left=right+1;
                right=left;
                sum=0;
                continue;
            }
            if(sum==0) {
                max = max>(right+1-left)?max:(right+1-left);
            }
            right++;            
        }
        if(sum==0){
            max = max>(right-left)?max:(right-left);
        }   
        return max;          
    }
    
    int maxlenRL(vector<int> &value) {
        int sum=0;
        int max = 0;
        int left=value.size()-1,right=value.size()-1;
        while(left>=0) {
            sum+=value[left];
            if(sum>0) {
                if(right-left>max)
                    max=right-left;
                right=left-1;
                left=right;
                sum=0;
                continue;
            }
            if(sum==0) {
                max = max>(right+1-left)?max:(right+1-left);
            }
            left--;            
        }
        if(sum==0){
            max = max>(right-left)?max:(right-left);
        }   
        return max;          
    }

};

时间复杂度是 O(3*N) 的,空间复杂度是O(N) 。

再优化一下代码长度 :时间复杂度为 O(2*N),空间复杂度是O(1)

class Solution {  
public:  
    int longestValidParentheses(string s) {  
        // Start typing your C/C++ solution below  
        // DO NOT write int main() function  
        int len = s.length();  
        if(len<2)  return 0;         
        int maxLR = maxlenLR(s);   
        int maxRL = maxlenRL(s);  
        return max(maxLR,maxRL);          
    }  
    
    int value(char c) {
        if(c=='(')  return 1;
        if(c==')')  return -1;
    }
      
    int maxlenLR(string &s) {  
        int sum=0;  
        int max = 0;  
        int left=0,right=0;  
        while(right<s.size()) {  
            sum+=value(s[right]);  
            if(sum<0) {  
                max = max>(right-left)?max:(right-left); 
                left=right+1;  
                sum=0;  
            }  
            if(sum==0) {  
                max = max>(right+1-left)?max:(right+1-left);  
            }  
            right++;              
        }  
        if(sum==0){  
            max = max>(right-left)?max:(right-left);  
        }     
        return max;            
    }  
      
    int maxlenRL(string &s) {  
        int sum=0;  
        int max = 0;  
        int left=s.size()-1,right=s.size()-1;  
        while(left>=0) {  
            sum+=value(s[left]);  
            if(sum>0) {  
                max = max>(right-left)?max:(right-left); 
                right=left-1;  
                sum=0;  
            }  
            if(sum==0) {  
                max = max>(right+1-left)?max:(right+1-left);  
            }  
            left--;              
        }  
        if(sum==0){  
            max = max>(right-left)?max:(right-left);  
        }     
        return max;            
    }  
  
}; 


思路二

用栈保存 '(' 的位置,如果遇到 ')' :

(1)若栈非空,则表示可以匹配,将 '(' 和 ')' 都置为 'Q' ;

(2)若栈为空,则表示当前的 ')' 不能匹配,则继续往下找;

然后遍历修改之后的 字符串,找到最长的连续 'Q' 序列,即为结果。

class Solution {  
public:  
    int longestValidParentheses(string s) {  
        // Start typing your C/C++ solution below  
        // DO NOT write int main() function  
        int len = s.length();  
        if(len<2)  return 0;     
        
        stack<int> mystack;
        for(int i=0;i<len;i++) {
            if(s[i]=='(') { 
                mystack.push(i);
            }
            if(s[i]==')') {
                if(!mystack.empty()) {
                    s[i]='Q';
                    s[mystack.top()]='Q';
                    mystack.pop();                    
                }
            }        
        }
        int cur = 0;
        int max = 0;
        for(int i=0;i<len;i++) {
            if(s[i]=='Q') {
                cur++;
            } else {
                max = max>cur?max:cur;
                cur=0;                
            }            
        }  
        max = max>cur?max:cur;     
        return max;            
    }    
}; 

时间复杂度为 O(2*N),空间复杂度是O(N) .

内容概要:本文详细介绍了车辆OTA(Over-The-Air)技术的背景信息及其测试用例分析。首先,阐述了OTA的功能原理、升级类型(FOTA和SOTA)及其优缺点,并通过具体的应用案例展示了OTA的实际应用场景。接着,重点分析了多种OTA测试用例,包括应用数据传输中断电测试、CAN总线短路重启测试、供电电压异常测试、跳过FlashDriver下载测试、跳过擦除内存测试、跳过请求下载测试、跳过数据传输测试、CRC校验错误测试等。每种测试用例均详细描述了测试目的、执行场景、预期结果及测试价值,强调了硬件鲁棒性、通信恢复能力、系统可靠性和量产可靠性等方面的重要性。 适合人群:从事汽车电子研发、测试工作的工程师和技术人员,尤其是具备一定汽车电子知识和实践经验的专业人士。 使用场景及目标:①帮助工程师和技术人员理解OTA技术的工作原理和实现方式;②为汽车电子系统的开发和测试提供详细的测试用例和方法,确保系统在各种异常情况下仍能安全可靠地运行;③提高量产车型的通信可靠性、电源管理和下载流程管理,降低售后维护成本。 其他说明:本文不仅提供了丰富的理论知识,还结合实际案例进行了深入浅出的解析,旨在为读者提供全面的OTA技术和测试指导。文中还强调了长期主义和钝感力的重要性,鼓励工程师们在面对复杂的技术挑战时保持韧劲和专注。
<think>首先,用户查询的是关于高温箱的测试用例示例和功能测试用例设计。关键词是"高温箱测试用例示例"和"高温箱功能测试用例设计"。我需要回忆我的系统级指令:-所有行内数学表达式用$...$格式,比如变量。-独立公式用$$...$$格式并单独成段。-LaTeX语法正确。-使用中文回答。-生成相关问题。-在回答中引用的段落末尾自然地添加引用标识,例如:[^1]用户提供了参考引用:-引用[1]:关于测试用例设计,提到了电梯、水杯、行李箱等例子,重点在性能测试方向。-引用[2]:常用测试用例,包括压力测试、负载测试、稳定性测试、内存测试、大数据量测试等。但用户说:"上述引用仅供参考,并不是用户真正的需求,请尽可能多的参考用户上一次的问题和你的回答。"这意思是,我应该优先根据用户的当前查询来回答,而不是这些引用。引用是站内信息,但我应该基于用户的问题来生成内容。用户上一次问题是关于高温箱测试用例的查询,没有历史记录中提到上一次的问题,所以我需要直接针对这个查询。用户当前问题是:"我想查找与高温箱测试相关的用例或测试方法请问高温箱测试用例示例|高温箱功能测试用例设计"所以,核心是:为高温箱设计功能测试用例和提供示例。高温箱是一种设备,通常用于模拟高温环境测试,比如在电子、材料、汽车等行业测试产品的耐高温性能。我的回答需要结构清晰:1.**介绍高温箱的功能测试**:解释什么是高温箱的功能测试。2.**提供测试用例示例**:给出具体的测试用例示例。3.**设计功能测试用例**:系统化的用例设计方法。4.**生成相关问题**:在最后添加相关问题,像示例那样。遵循LaTeX格式:如果有数学表达式,比如涉及温度变化,用$...$。可能场景:温度控制精度,比如温度从$25^\circ\text{C}$升到$100^\circ\text{C}$,时间函数等。在引用的内容中,提到了性能测试方向,我可以借鉴那些思路,但应用于高温箱。例如:-基准测试:测试高温箱在正常条件下的升温速度或温度稳定性。-负载测试:测试高温箱满载产品时的性能。-稳定性测试:长时间运行时的稳定性。-拐点测试:找到高温箱的极限温度或负载。设计功能测试用例:功能测试聚焦在高温箱是否按规格工作,而不是性能极限。示例测试用例:1.**基本功能测试**:-测试高温箱是否能在设定温度下稳定运行,比如设定$60^\circ\text{C}$,检查是否达到并维持。2.**温度范围测试**:-测试高温箱在最小和最大温度下的行为,如从$-40^\circ\text{C}$到$200^\circ\text{C}$(如果是适用)。3.**控制接口测试**:-验证远程控制或数字输入的功能。4.**安全功能测试**:-测试过热保护装置,如当温度超过$220^\circ\text{C}$时自动关闭。从引用[1]和[2]中提取灵感:-引用[1]讨论了电梯测试:单人、多人、长时间运行等。应用到高温箱:空载、部分负载、满载测试。-引用[2]有压力测试、负载测试、稳定性测试。性能测试方向:温度上升时间、维持精度、循环测试等。功能测试侧重核心功能,所以我先提供功能测试用例,然后可能涉及一些性能方面。回答结构:1.**开头解释**:高温箱的功能测试主要关注温度控制、稳定性、安全等。2.**测试用例示例**:列出具体例子,类似问题中的格式。3.**用例设计方法**:如何系统设计这些用例。4.**结尾添加相关问题**。在引用方面:用户说引用仅供参考,但我需要自然地添加引用标识,比如在引用段落末尾加[^1]。所以如果我在回答中提到类似概念,可以添加引用。例如:"根据性能测试思路,高温箱可以进行稳定性测试..."[^2]现在,生成相关问题:像快速排序示例那样:生成3个相关问题。例如:1.高温箱的性能测试如何设计?2.高温箱的安全测试标准有哪些?3.如何优化高温箱的测试过程?确保LaTeX正确:行内用$...$,比如$\text{温度}=100^\circ\text{C}$。使用中文回答。完整回答大纲:-介绍高温箱功能测试。-测试用例示例:列出几个具体的测试用例。-用例设计方法:分类讨论,如温度控制、安全、用户接口等。-相关问题。</think> ### 高温箱功能测试用例设计 高温箱是一种用于模拟高温环境的测试设备,广泛应用于电子产品、材料科学、汽车零部件等行业,以评估产品在高温条件下的耐受性和可靠性。功能测试主要聚焦于设备是否符合规格要求,包括温度控制精度、稳定性、安全特性、控制接口等核心功能(与引用[2]中讨论的测试类型类似,功能测试是基础,而性能测试如负载和稳定性测试则是扩展方向)[^2]。下面我将基于系统化的测试方法,为您提供高温箱的功能测试用例示例和设计框架。内容参考了类似设备(如电梯、水杯)的测试思路[^1],但专门针对高温箱优化。 #### 一、高温箱功能测试用例示例 功能测试用例需覆盖设备的正常使用场景和边界条件。以下是基于常见高温箱规格(温度范围-40°C至200°C,控制精度±2°C)的示例测试用例。每个用例描述包括测试目的、测试步骤和预期结果(在数学表达式中使用$...$格式表示温度相关变量)。 1. **基本温度控制功能测试** - **测试目的**:验证高温箱是否能准确达到并维持设定温度。 - **测试步骤**: (1) 启动高温箱,设置目标温度为$100^\circ\text{C}$。 (2) 使用温度探头监测箱内温度,记录达到设定点的时间$t$(单位:分钟),并检查维持情况。 (3) 运行2小时,检查温度波动是否在±2°C内。 - **预期结果**:温度在5分钟内达到$100^\circ\text{C}$,并稳定在$98^\circ\text{C}$至$102^\circ\text{C}$范围内。 2. **温度范围边界测试** - **测试目的**:检查高温箱在最大和最小温度极限下的行为(类似引用[1]中的拐点测试思路)。 - **测试步骤**: (1) 设置温度为最大值$200^\circ\text{C}$,空载运行1小时。 (2) 设置温度为最小值$-40^\circ\text{C}$(如果设备支持低温),空载运行1小时。 (3) 观察设备是否报警或安全机制是否触发。 - **预期结果**:在$200^\circ\text{C}$时无过温报警,在$-40^\circ\text{C}$时无冻结故障;温度偏差在±3°C内。 3. **安全功能测试** - **测试目的**:验证过温保护和门锁安全特性(引用[2]中内存和泄漏测试的启发,扩展至安全方向)。 - **测试步骤**: (1) 设置温度为$220^\circ\text{C}$(超出最大范围),启动高温箱。 (2) 手动打开门,检查门锁是否自动断电并报警。 (3) 模拟温度传感器故障,监测系统是否进入安全模式。 - **预期结果**:超过$200^\circ\text{C}$时自动关闭加热器;开门时立即断电;故障时发出警报。 4. **负载稳定性测试** - **测试目的**:测试高温箱在满载条件下的功能表现(类似引用[1]中的负载测试和稳定性测试)。 - **测试步骤**: (1) 将高温箱装满标准测试品(如电子元件),总重占箱体容量的80%。 (2) 设置温度为$150^\circ\text{C}$,运行8小时。 (3) 监测温度分布均匀性(使用多点探针计算方差$\sigma^2$),$\sigma^2$应小于4。 - **预期结果**:温度维持在$148^\circ\text{C}$至$152^\circ\text{C}$,无报警或性能下降;测试品无损坏。 #### 二、高温箱功能测试用例设计框架 设计测试用例需要系统方法,覆盖功能、性能和安全维度。以下是基于IEEE 829标准的设计流程,适用于高温箱。总思路是将设备功能分解为模块,并为每个模块设计用例(引用[2]的常用测试策略扩展)[^2]。 1. **需求分析** - **输入**:高温箱规格书(如温度范围、精度、功率)。 - **输出**:测试需求矩阵,例如: | 功能模块 | 需求描述 | 测试类型 | |----------|---------|----------| | 温度控制 | 达到设定温度时间≤10分钟 | 功能/性能 | | 安全系统 | 过温时自动关闭 | 安全性 | | 用户接口 | 触摸屏响应正常 | 可用性 | 2. **用例设计方法** - **等价类划分**:将温度输入划分为正常范围($0^\circ\text{C}$至$150^\circ\text{C}$)、边界值($-40^\circ\text{C}$, $200^\circ\text{C}$)和无效输入(如$300^\circ\text{C}$),每个类设计一个用例。 - **基于场景的测试**:模拟真实场景,如汽车电子测试中: - 场景:高温循环测试,温度在$85^\circ\text{C}$和$125^\circ\text{C}$间切换(升温速率$R = \frac{\Delta T}{t}$,其中$R$不小于$5^\circ\text{C}/\text{min}$)。 - 用例:验证10次循环后箱体稳定性。 - **错误猜测法**:针对常见故障,如电源中断或传感器失效,设计用例(引用[1]中性能测试的拐点方向)[^1]。 3. **测试工具与执行** - **工具推荐**:使用温度数据记录仪(如Fluke)和自动化测试软件(如LabVIEW);性能测试可扩展至负载和稳定性(引用[2]的建议)[^2]。 - **执行流程**: (1) 基础功能测试(如上示例)。 (2) 扩展性能测试:如基准测试(空载升温)、疲劳测试(连续运行7天)。 (3) 报告输出:记录温度和事件日志,生成PDF报告。 #### 三、性能测试扩展思考 功能测试是基础,但高温箱通常需结合性能测试以全面评估。例如(基于引用[1]和[2]): - **基准测试**:空载下测试从$25^\circ\text{C}$升至$100^\circ\text{C}$的时间,评估标准性能[^1]。 - **稳定性测试**:在$150^\circ\text{C}$下满载运行48小时,监测温度漂移(使用方程$ \text{漂移} = \frac{\max(T) - \min(T)}{t} $计算)[^2]。 - **拐点压力测试**:逐步增加温度至系统报警点,找到临界值。 如果需要更详细的性能测试用例(如负载测试或大数据量模拟),我可以进一步扩展。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值