casyup.me@outlook.com

0%

leetcode/20ValidParentheses

判断字符串是都按正确格式闭合

思路:

当一个字符被看到时, 预料与之对应的字符, 当该字符不是预料的字符, 有两种可能

  1. 失败
  2. 被包含, 例如 ({}), 当看到 ‘(‘ 时候, 我们想要的是 ‘)’. 但该语句是合法的

如果是第二种, 那么 ‘(‘ 要被保存起来, 这种数据结构非常适合用栈来做

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class Solution {
public:
bool isValid(string s) {
if (!s.size()) return true;
if (s.size() < 2) return false;

map<char, char> lettermap{
{'(', ')'},
{'{', '}'},
{'[', ']'},
};
vector<char> vch{ s[0] };
for (int i = 1; i < s.size(); ++i) {
if (lettermap[vch.back()] != s[i]) vch.push_back(s[i]);
else {
vch.pop_back();
if (vch.size()) {}
else if (++i < s.size())
vch.push_back(s[i]);
}
}

return !vch.size();
}
};

该代码并未在循环中判断是否合法

实际情况中, 可能一个非常长的字符串一开始就错了, 比如; “){}{}{}{}…”

但是依旧会将整个字符串循环一次, 这样做有三点考虑:

  1. 代码更加简单, 简洁. 更容易理解
  2. 如果代码的确需要很多判断才能确定结果, 那么多加条件语句反而是一种额外的消耗
    并且是O(n)复杂度, 节省的效率并不会有多少, 同时额外的消耗并不一定会比加条件语句多

PS: 如果能想到用栈结构来做这个题的话, 会方便很多. 如果没想到的话, 可能会越想越难.