有效的括号

发布时间 2023-06-01 09:30:27作者: 颖风船

给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。

有效字符串需满足:

左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
每个右括号都有一个对应的相同类型的左括号。

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/valid-parentheses
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。


 

 

一个新的用法:

  char c : s 是一个 C++11 特性的语法,表示对字符串 s 进行遍历,对于字符串中每个字符 c,都执行一次代码块中的操作。它在范围 for 循环(range-based for loop)中很常用。

具体来说,这个语法相当于以下的写法:

 

for (auto it = s.begin(); it != s.end(); ++it) {
    char c = *it;

    // 代码块中的操作
}

   

  在遍历字符串时,使用 auto 自动推导迭代器类型,迭代器类型为 string::iterator,也可以显式指定迭代器类型,即 string::iterator c。在代码块中,我们可以直接使用 c 来访问当前字符。

例如,在这个问题中,我们可以使用 for (char c : s) 来遍历字符串 s 中的每个字符,执行括号匹配的操作。

 


 

 

这是一个经典的括号匹配问题,可以使用栈来解决。具体地,从左到右遍历字符串的每个字符,如果是左括号,则将其压入栈中;如果是右括号,则取出栈顶元素,判断其是否与当前右括号匹配,如果匹配则继续遍历,否则返回false。如果遍历完字符串后栈为空,则返回true,否则返回false。

#include <iostream>
#include <stack>
#include <string>

using namespace std;

bool isValid(string s) {
    stack<char> st; // 定义一个栈,用来存放左括号

    for (char c : s) {
        if (c == '(' || c == '[' || c == '{') { // 如果是左括号,则将其压入栈中
            st.push(c);
        } else if (c == ')' || c == ']' || c == '}') { // 如果是右括号,则取出栈顶元素,并判断是否匹配
            if (st.empty()) { // 如果栈为空,则说明没有左括号匹配
                return false;
            }

            char top = st.top(); // 取出栈顶元素

            if ((c == ')' && top != '(') || (c == ']' && top != '[') || (c == '}' && top != '{')) {
                // 如果当前右括号与栈顶元素不匹配,则返回false
                return false;
            }

            st.pop(); // 如果匹配,则将左括号弹出栈
        }
    }

    return st.empty(); // 如果遍历完字符串后,栈为空,则返回true,否则返回false
}

int main() {
    string s = "()[]{}"; // 初始化一个字符串
    bool valid = isValid(s); // 判断字符串是否有效
    cout << valid << endl; // 输出结果,期望输出为1(即true)

    return 0;
}