题目

给定一个只包含 '(', ')', '{', '}', '[' 和 ']' 的字符串 s,判断 s 是否有效。有效字符串需满足以下条件:

  • 左括号必须用相同类型的右括号闭合。
  • 左括号必须以正确的顺序闭合。

引言

有效的括号问题可以使用栈来解决,我们需要将左括号入栈,每次遇到右括号时,判断栈顶的左括号是否与之匹配。如果匹配,则将栈顶的左括号出栈,继续处理下一个字符;如果不匹配,或者栈为空,说明括号无效。解决这个问题需要使用栈数据结构和字符处理。

算法思路

我们将使用栈的方法来解决有效的括号问题。

算法的步骤如下:

  1. 创建一个栈 stack,用于存储左括号。
  2. 遍历字符串 s 中的每个字符:

    • 如果当前字符是左括号 '(', '{' 或 '[', 将其入栈。
    • 如果当前字符是右括号 ')', '}' 或 ']', 判断栈是否为空:

      • 如果栈为空,返回 false,因为没有匹配的左括号。
      • 如果栈不为空,判断栈顶的左括号与当前右括号是否匹配:

        • 如果匹配,将栈顶的左括号出栈,继续处理下一个字符。
        • 如果不匹配,返回 false,因为括号无效。
  3. 在遍历完字符串 s 后,判断栈是否为空:

    • 如果栈为空,说明所有括号都有匹配的右括号,返回 true。
    • 如果栈不为空,说明还有未匹配的左括号,返回 false。

代码实现

下面是使用C语言实现的代码:

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include <string.h>

typedef struct Stack {
    char* data;
    int top;
} Stack;

Stack* createStack(int capacity) {
    Stack* stack = (Stack*)malloc(sizeof(Stack));
    stack->data = (char*)malloc(sizeof(char) * capacity);
    stack->top = -1;
    return stack;
}

void push(Stack* stack, char ch) {
    stack->top++;
    stack->data[stack->top] = ch;
}

char pop(Stack* stack) {
    char ch = stack->data[stack->top];
    stack->top--;
    return ch;
}

bool isValid(char* s) {
    int length = strlen(s);
    Stack* stack = createStack(length);

    for (int i = 0; i < length; i++) {
        char ch = s[i];

        if (ch == '(' || ch == '{' || ch == '[') {
            push(stack, ch);
        } else if (ch == ')' || ch == '}' || ch == ']') {
            if (stack->top == -1) {
                return false;
            }

            char top = pop(stack);

            if ((ch == ')' && top != '(') || (ch == '}' && top != '{') || (ch == ']' && top != '[')) {
                return false;
            }
        }
    }

    if (stack->top != -1) {
        return false;
    }

    return true;
}

int main() {
    char* s1 = "()";
    char* s2 = "()[]{}";
    char* s3 = "(]";
    char* s4 = "([)]";
    char* s5 = "{[]}";

    printf("%s is %s\n", s1, isValid(s1) ? "valid" : "invalid");
    printf("%s is %s\n", s2, isValid(s2) ? "valid" : "invalid");
    printf("%s is %s\n", s3, isValid(s3) ? "valid" : "invalid");
    printf("%s is %s\n", s4, isValid(s4) ? "valid" : "invalid");
    printf("%s is %s\n", s5, isValid(s5) ? "valid" : "invalid");

    return 0;
}

算法分析

该算法只需要对字符串进行一次遍历,并在栈上进行入栈和出栈操作,所以时间复杂度为 O(n),其中 n 是字符串的长度。

空间复杂度为 O(n),算法使用了额外的栈来存储左括号。

示例和测试

示例输入1:

s = "()"

示例输出1:

valid

示例输入2:

s = "()[]{}"

示例输出2:

valid

示例输入3:

s = "(]"

示例输出3:

invalid

示例输入4:

s = "([)]"

示例输出4:

invalid

示例输入5:

s = "{[]}"

示例输出5:

valid

总结

本文使用C语言实现了解答有效的括号问题的代码。通过使用栈数据结构和字符处理,我们能够判断给定的括号字符串是否有效。该算法的时间复杂度为 O(n),空间复杂度为 O(n)。

标签: 编程算法, 编程算法题, 编程算法大全, 编程算法流程, 算法设计与分析, 数据结构与算法, 算法优化, 算法实现, 常见编程算法, 编程算法入门, 编程算法进阶, 编程算法精通