给定一个只包括 '(',')','{','}','[',']' 的字符串 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; }
标签:遍历,false,有效,st,括号,字符串,匹配 From: https://www.cnblogs.com/Bingley-Z/p/17447995.html