Ps:含有两版代码
一。思路:
很显然,这是一个括号匹配问题。我们可以这样理解题意:
1.一旦有 '(' ,就必然有 ')' 。
2.可以只关注括号。
3.输出只有一个,就是最大值。
由此,我们给出示例:
1.(x) 型:() -> out:1
2.(xy) 型:(()(())) -> out: 3
不难发现:
1.无论怎样,一个x(或 y)的值只取决于其所具有的 '(' 或 ')' 的个数。
2. out = max(xi)。
所以:
我们只需要去找到每个x所具有的 '(' 或 ')' 的个数就行了!
观察发现:
将 '(' 理解为进入x,则 ')' 可以理解为出x,我们要的x的值就必然在进出的转折点,所以,我们可以将 ')' 作为一个信号。
结论:
用cnt 记录x的值,当 '(' 出现时就 +1 操作,当 ')' 出现时就 -1 操作,同时用 max 记录下x的值。
二。代码:
//第一版 (记录了每一个x的值,便于理解?)
#include<iostream>
#include<string>
using namespace std;
int cnt[100];
int main() {
string t, s = " ";
cin >> t;
s += t;
int len = s.length();
for (int i = 1; i < len; i++) {
if (s[i] == '(') cnt[i] = cnt[i - 1] + 1;
else if (s[i] == ')') cnt[i] = cnt[i - 1] - 1;
else cnt[i] = cnt[i - 1];
}
int max = -1;
for (int i = 1; i < len; i++) {
max = max > cnt[i] ? max : cnt[i];
}
cout << max << endl;
return 0;
}
//第二版,优化(ps:hi hi)
#include<cstdio>
char ch;
int depth, max;
int main() {
while ((ch = getchar()) && ch != EOF) {
if (ch == '(') depth++;
else if (ch == ')') max = max > depth-- ? max : depth+1;
}
printf("%d\n", max);
return 0;
}
三。作者有话说:
其实一开始想用递归的,但是发现条件难找,就放弃了。另外,我写的真的很认真了,希望能帮到你!

京公网安备 11010502036488号