首页 > 试题广场 >

合法的括号字符串

[编程题]合法的括号字符串
  • 热度指数:16055 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给定一个字符串s,字符串s只包含以下三种字符: (,*,),请你判断 s是不是一个合法的括号字符串。合法括号字符串有如下规则:
1.左括号'('必须有对应的右括号')'
2.右括号')'必须有对应的左括号'('
3.左括号必须在对应的右括号前面
4.*可以视为单个左括号,也可以视为单个右括号,或者视为一个空字符
5.空字符串也视为合法的括号字符串

数据范围:

示例1

输入

"()()"

输出

true
示例2

输入

"((*)"

输出

true
示例3

输入

"(*)"

输出

true
示例4

输入

"(((*)"

输出

false
需要用双栈,和压入下标的方法解答此题。
#include <string.h>
#include <stdbool.h>

#define MAXSIZE 100

#define NEEDNULL  0u
#define NEEDRIGHT 1u
#define NEDDLEFT  2U

typedef int ElementType;

typedef struct{
    ElementType data[MAXSIZE];
    int top;
}Stack;

void initStack(Stack *s)
{
    s->top=-1;
}

bool isStackEmpty(Stack *s)
{
    return s->top == -1;
}

bool isStackFull(Stack *s)
{
    return s->top == (MAXSIZE-1);
}

bool Stackpush(Stack *s,ElementType item)
{
    if(isStackFull(s))
        return false;
    
    s->data[++s->top]=item;
    return true;
}

bool Stackpop(Stack *s,ElementType *item)
{
    if(isStackEmpty(s))
        return false;
    *item = s->data[s->top--];
    return true;
}

bool isValidString(char* s ) 
{
    int i,leftnums=0,rightnums=0,dotnums=0,needchar=NEEDNULL;

    Stack usrstack;
    Stack starstack;
    ElementType item,staritem;

    initStack(&usrstack);
    initStack(&starstack);

    for(i=0;i<strlen(s);i++)
    {
        if(s[i]=='(')
            leftnums++;
        else if(s[i]==')')
            rightnums++;
        else if(s[i]=='*')
            dotnums++;
    }

    if(leftnums>rightnums)
    {
        if(rightnums+dotnums<leftnums)
            return false;
    }
    else if(rightnums>leftnums)
    {
        if(leftnums+dotnums<rightnums)
            return false;
    }
    else {
    
    }

    for(i=0;i<strlen(s);i++)
    {
        if(s[i]=='(')
        {   
            Stackpush(&usrstack,i);
        }
        else if(s[i]=='*' )
        {
            Stackpush(&starstack,i);
        }
        else if(s[i]==')')
        {
            if(!isStackEmpty(&usrstack))
                Stackpop(&usrstack,&item);
            else if(!isStackEmpty(&starstack))
                Stackpop(&starstack,&item);
            else
                return false;
        }
    }

    while(!isStackEmpty(&usrstack)&&!isStackEmpty(&starstack))
    {
        Stackpop(&usrstack, &item);
        Stackpop(&starstack,&staritem);
        if(item>staritem)
            return false;
    }

    return isStackEmpty(&usrstack);
}

发表于 2025-01-25 00:59:24 回复(0)
/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 *
 * @param s string字符串
 * @return bool布尔型
 */
bool isValidString(char* s ) {
    // write code here
    int a = strlen(s);
    int i, b = 0, c = 0, b1 = 0, c1 = 0;
    for(i = 0;i< a;i++)
    {
        if(*(s + i) == '(') b++;
        if(*(s + i) == ')') b--;
        if(*(s + i) == '*') c++;
        if((b + c) < 0) return false;
    }
    for(i = a-1;i>=0;i--)
    {
        if(*(s + i) == '(') b1--;
        if(*(s + i) == ')') b1++;
        if(*(s + i) == '*') c1++;
        if((b1 + c1) < 0) return false;
    }
    if(b < 0) b= -b;
    if(b == 0) return true;
    if(b <= c) return true;
    else return false;
}
发表于 2023-04-22 15:34:04 回复(0)