有效的括号
给定一个只包括 '(',')','{','}','[',']' 的字符串 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;
}

浙公网安备 33010602011771号