问题描述:
Given a string containing just the characters '('
, ')'
, '{'
, '}'
, '['
and ']'
, determine if the input string is valid.
The brackets must close in the correct order, "()"
and "()[]{}"
are all valid but "(]"
and "([)]"
are not.
问题1:什么是Valid Parentheses?
有效的括号。
问题2: for (auto c:s)啥意思
简单来说, s是字符串, 它是由字符组成的, 所以基于范围的
for
会识别出来 c 是字符类型.
问题3:string中的find函数
string中 find()的应用,
栈知识点:数据结构、算法与应用 C++语言描述P175,该书中还有类似的例子P184
C++程序设计语言(第4部分:标准库)P54
线性表是一种常用的数据结构。在实际应用中,线性表都是以栈、队列、字符串、数组等特殊线性表的形式来使用的。由于这些特殊线性表都具有各自的特性,因此,掌握这些特殊线性表的特性,对于数据运算的可靠性和提高操作效率都是至关重要的。线性表是一个线性结构,它是一个含有n≥0个结点的有限序列,对于其中的结点,有且仅有一个开始结点没有前驱但有一个后继结点,有且仅有一个终端结点没有后继但有一个前驱结点,其它的结点都有且仅有一个前驱和一个后继结点。
解答及测试代码:
#include <stack>
#include <iostream>
#include <string>
using namespace std;
class Solution{
public:
bool isValid(string const& s){
string left = "([{";
string right = ")]}";
stack<char> stk; //声明栈
for (auto c : s){ //针对函数输入的字符串而言,针对字符串中的每一个字符
if (left.find(c) != string::npos){ //find()返回第一个找到的索引,若没找到返回string::npos
stk.push(c); //将元素压入栈顶,找到了([{这样的,就压入栈顶
}
else { //相当于没在left中找到
if (stk.empty() || stk.top() != left[right.find(c)]) //top返回栈顶元素,empty()判断是否为空,若左右不匹配也错
return false; //没问题,因为题干中指的是containing just the characters.....,所以第一个不属于left,就错误
else
stk.pop(); //删除栈顶元素,也就是说上面这一关过了,之后,就得把这个括号的东西删除掉,继续找下一个字符
}
}
return stk.empty(); //最后看stk是否清空,若清空了,就说明一一对应,就没问题了
}
};
int main(){
string A = "()[]";
string B = "([])";
string C = "([)]";
Solution mySolution;
cout << mySolution.isValid(C) << endl;
return 0;
}