参考

  • string

前言

三种类型的括号
要么按顺序两两一对,要么首尾一对对内嵌。

根据示例2

输入:s = “()[]{}”
输出:true

示例4

输入:s = “{[]}”
输出:true

看到具体效果。


正文

正常看到这个题目,原本是想通过string的replace去替换掉一组成员,然后循环判断,但是c++的replace不是很好使就算了。。。

那就按照关系,去看一下ASCII码,发现这几个括号之间相差1或2的情况。如下图第三列情况:

那么在if关系中应该是

1
if(s[i]+1 == s[i+i] || s[i]+2 == s[i+i]) 

当然这种情况是括号两两一对按序排列的理想情况

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Solution {
public:
bool isValid(string s) {

int n = 0, n2 = 0;
int len = s.length();


for(int i = 0; i < len; i++){
if(s[i]+1 == s[i+1] || s[i]+2 == s[i+1])
n++;

if(i < len/2 && (s[i]+1 == s[len-i-1] || s[i]+2 == s[len-i-1]))
n2++;

}


return (n == len/2 || n2 == len/2);
}
};

其实这样写也有点不靠谱,两种情况放到一起有点不太明确,看着也会很奇怪。
第一种情况就是两两一对
第二种情况就是头尾一对往里推

测试一下这个案例没问题。

好家伙。。抛开头和尾,里面这样组合也确实是闭合的图形,突然给我整不会了。

思路一下子打不开了。。感觉陷进去了,挣扎了挺久的看了下评论区全是用栈的方式来弄,这样好像就没看到什么暴力解体的思路了,stack还没怎么用过不熟悉,看来这题要搁置先了


结语