做的时候第一波数据水的要死,结果HACK时间直接被黑了。
从题意来看最后结果为((((或))))或))))((((这三种情况必居其一
思路是从左到右和从右到左各扫描一次记录 ( 和 ) 的到每个位置的数量,求将每个位置左方全转置成 ) 和右方全转置成 ( 需要的次数和,这么算发现有一个转置是不必要的,注意减一
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <algorithm>
using namespace std;
int main()
{
int T;
char s[1010];
int r[1010], l[1010];
int i, lens;
while (~scanf("%d", &T)) {
while (T--) {
scanf("%s", s);
lens = strlen(s);
for (i = lens - 1; i >= 0; i--) { ///扫描 ) 的数量
if (i == lens - 1) {
r[i] = (s[i] == ')');
} else {
r[i] = r[i + 1] + (s[i] == ')');
}
}
for (i = 0; i < lens; i++) { ///扫描 ( 的数量
if (i == 0) {
l[i] = (s[i] == '(');
} else {
l[i] = l[i - 1] + (s[i] == '(');
}
}
int ans = 99999999;
for (i = 0; i < lens; i++)
ans = min(ans, r[i] + l[i] - 1); ///寻找某位置左右转置需要的最小次数,注意减一
printf("%d\n", ans);
}
}
return 0;
}