自己编写的代码 。
自己的思路:
class Solution {
private:
unordered_map<char,int>symbolValues={
{'(',1},
{')',2},
{'{',4},
{'}',5},
{'[',8},
{']',9},
};
public:
bool isValid(string s) {
bool flag=false;
int lens=s.length();
if (lens % 2 != 0)
{
flag = false;
}
for(int i=0;i<lens;i+=2)
{
int value = symbolValues[s[i]];
int value1 = symbolValues[s[i+1]];
if(value>=value1||value1-value!=1)
{
int n=(lens/2);
if(symbolValues[s[n]]-symbolValues[s[n-1]]!=1)
{flag = false;}
}
}
return flag;
}
};
官方解答:
讲一下思路吧这里定义了一个map,都是字符类型的,对应了键和值的操作。定义了一个栈,这个栈是一个线性结构,开始遍历,目前还是不知道这里为什么用for(char ch:s),然后去搜索,得到参考文档[1]。创建一个char 的字符串类型,去遍历字符串s。这里的if(pairs.count(ch))如果
stack<char>stk 语句参考文档[2] .
这里pairs.count(ch)是此算出ch在pais.出现的次数。
如果是右括号,就返回1,左括号返回0.GPT搭的好像不是很对,然后如果是右括号,就进入如下判断,首先判断这个容器是是否为空栈或者栈顶不等于当前键和值,栈顶的元素,比如(要与)配对即stk.top() == pairs[ch] ,如果不是一对就返回false,
心得:这道题利用了栈的后进先出的原理。
[1]C++ for(char c:s)遍历字符串 增强型for循环_c++增强for循环_龙叙的博客-CSDN博客
class Solution {
public:
bool isValid(string s) {
int n = s.size();
if (n % 2 == 1) {
return false;
}
unordered_map<char, char> pairs = {
{')', '('},
{']', '['},
{'}', '{'}
};
stack<char> stk;
for (char ch: s) {
if (pairs.count(ch)) {
if (stk.empty() || stk.top() != pairs[ch]) {
return false;
}
stk.pop();
}
else {
stk.push(ch);
}
}
return stk.empty();
}
};