题目链接:点击打开链接
给出一个字符串, 要求左右括号相互匹配, 右括号间可以相互转换, 问最少需要转换的数量.
记录左括号的数量, 如果开始时就没有左括号, 那么无法转换. 否则如果右括号与左括号不匹配的话, ans+1. 最后如果还有剩余括号未匹
配, 则转换失败.
AC代码:
#include "iostream"
#include "cstdio"
#include "cstring"
#include "algorithm"
#include "queue"
#include "stack"
#include "cmath"
#include "utility"
#include "map"
#include "set"
#include "vector"
#include "list"
#include "string"
#include "cstdlib"
using namespace std;
typedef long long ll;
const int MOD = 1e9 + 7;
const int INF = 0x3f3f3f3f;
const int MAXN = 1e6 + 6;
char s[MAXN], tmp[MAXN];
int num, ans;
int main(int argc, char const *argv[])
{
scanf("%s", s);
int len = strlen(s);
for(int i = 0; i < len; ++i) {
if(s[i] == '<' || s[i] == '{' || s[i] == '[' || s[i] == '(') tmp[++num] = s[i];
else {
if(num == 0) {
printf("Impossible\n");
return 0;
}
if(abs(s[i] - tmp[num]) > 2) ans++;
num--;
}
}
if(num) {
printf("Impossible\n");
return 0;
}
printf("%d\n", ans);
return 0;
}