列表

详情


NC175. 合法的括号字符串

描述

给定一个字符串s,字符串s只包含以下三种字符: (,*,),请你判断 s是不是一个合法的括号字符串。合法括号字符串有如下规则:
1.左括号'('必须有对应的右括号')'
2.右括号')'必须有对应的左括号'('
3.左括号必须在对应的右括号前面
4.*可以视为单个左括号,也可以视为单个右括号,或者视为一个空字符
5.空字符串也视为合法的括号字符串

数据范围:

示例1

输入:

"()()"

输出:

true

示例2

输入:

"((*)"

输出:

true

示例3

输入:

"(*)"

输出:

true

示例4

输入:

"(((*)"

输出:

false

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C 解法, 执行用时: 3ms, 内存消耗: 404KB, 提交时间: 2022-07-25

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param s string字符串 
 * @return bool布尔型
 *
 * C语言声明定义全局变量请加上static,防止重复定义
 */
#include<stdbool.h>

char IsValid_positive(char* s ) 
{
    int Left_num = 0;
    int Right_num = 0;
    int Star_num = 0;
    
    
    if( *s == ')' ) return 0;
    
    while( *s )
    {
        switch( *s )
        {
            case '(':
                Left_num++;
                break;
            case '*':
                Star_num++;
                break;
            case ')':
                Right_num++;
                break;
        }
        s++;
        if( Right_num > Star_num+Left_num ) return 0;
    }
    return 1;
}


char IsValid_negative(char* s ) 
{
    int Left_num = 0;
    int Right_num = 0;
    int Star_num = 0;
    
    
    if( *s == '(' ) return 0;
    
    while( *s )
    {
        switch( *s )
        {
            case '(':
                Left_num++;
                break;
            case '*':
                Star_num++;
                break;
            case ')':
                Right_num++;
                break;
        }
        s--;
        if( Left_num > Star_num+Right_num ) return 0;
    }
    
    return 1;
}


bool isValidString(char* s ) 
{
    if( strlen(s)==0 ) return false;
    if( strlen(s) == 1 )
    {
        if( *s != '*' ) return false;
        else return true;
    }
    
    int len = strlen(s);
    
    char * res = ( char * )malloc( sizeof(char)*len );
    
    res = s+len-1;
    
    if( IsValid_positive(s)  && IsValid_negative(res) ) return true;
    else return false;

    
      

    
}





C++ 解法, 执行用时: 3ms, 内存消耗: 408KB, 提交时间: 2021-12-10

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param s string字符串 
     * @return bool布尔型
     */
    bool isValidString(string s) {
        // write code here
        int len=s.size();
        int cnt=0;
        for(int i=0;i<len;i++){
            if(s[i]==')'){
                cnt--;
                if(cnt<0)
                    return false;
            }
            else
                cnt++;
        }
        cnt=0;
        for(int i=len-1;i>=0;i--){
            if(s[i]=='('){
                cnt--;
                if(cnt<0)
                    return false;
            }
            else
                cnt++;
        }
        return true;
    }
};

C++ 解法, 执行用时: 3ms, 内存消耗: 412KB, 提交时间: 2022-07-20

class Solution {
public:
    bool isValidString(string s) {
        stack<int> left;//保存左括号的下标
        stack<int> star;//保存星号的下标
        for(int i=0;i<s.size();i++){
            if(s[i]=='('){//左括号的下标进栈
                left.push(i);
            }else if(s[i]=='*'){//星号的下标进栈
                star.push(i);
            }else if(s[i]==')'){//右括号进行匹配
                if(!left.empty()){//先和左括号匹配
                    left.pop();
                }else if(!star.empty()){//如果左括号匹配失败则和星号匹配
                    star.pop();
                }else {//匹配不成功,字符串非法
                    return false;
                }
            }
        }
        //右括号全部匹配成功,判断左括号和星号是否合法
        while(!left.empty()&&!star.empty()){
            int lt=left.top();
            int st=star.top();
            left.pop();
            star.pop();
            if(st<lt){//星号如果不在左括号右边,非法
                return false;
            }
        }
        if(left.empty()){
            return true;
        }else return false;
    }
};

C++ 解法, 执行用时: 3ms, 内存消耗: 412KB, 提交时间: 2022-05-13

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param s string字符串 
     * @return bool布尔型
     */
    bool isValidString(string s) {
        // write code here
        
        list<char> lt;
        for(char ch:s){
            if(ch=='(')
                lt.push_back(ch);
            else if(ch=='*')
                lt.push_back(ch);
            else{
                auto it=lt.rbegin();
                for(;it!=lt.rend()&&(*it)!='(';++it);
                
                if(it!=lt.rend()){
                    lt.erase((++it).base());
                }
                else if(lt.back()=='*'){
                    lt.pop_back();
                }
                else
                    return false;
            }
        }
        
        bool res=true;
        
        while(lt.empty()==false){
            auto it1=lt.begin();
            auto it2=lt.begin();
        
            for(;it1!=lt.end()&&(*it1)!='(';++it1);
        
            if(it1==lt.end()){
                res=true;
                break;
            }
        
            for(it2=it1;it2!=lt.end()&&(*it2)!='*';++it2);
            
            if(it2==lt.end()){
                res=false;
                break;
            }
            
            lt.erase(it1);
            lt.erase(it2);
        }
        
        return res;
    }
};

C 解法, 执行用时: 3ms, 内存消耗: 416KB, 提交时间: 2022-04-13

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param s string字符串 
 * @return bool布尔型
 *
 * C语言声明定义全局变量请加上static,防止重复定义
 */
bool isValidString(char* s ) {
    // write code here
    int mincount=0;
    int maxcount=0;
    int lens =strlen(s);
    for(int i=0;i<lens;i++){
        char c=s[i];
        if(c=='('){
            mincount++;
            maxcount++;
        }    
         else if(c==')'){
                if(mincount>0){
                    mincount--;
                }
                if(maxcount==0){
                    return false;
                }
                maxcount--;
            }
            //如果是*号,minCount减1,maxCount加1
            else{
                if(mincount>0){
                    mincount--;
                }
                maxcount++;
            }
        }
        //只要minCount为0,说明左括号能全部抵消掉,字符串合法
        return mincount==0;
}

上一题