NC213474. 贪玩的二小姐(续)
描述
芙兰朵露拿到了一个只含有 '(' 和 ')' 这两种字符的字符串。芙兰想玩一玩这个字符串。
现在将字符串括号匹配定义如下:
例如,"(()())" 是匹配的 , "())(()"则不是匹配的。
芙兰朵露每一次操作可以将括号翻转,即把左括号变成右括号,或者把右括号变成左括号。
她想知道将给定的字符串变成匹配的,需要最少的操作次数是多少?
输入描述
第一行一个正整数,代表给定字符串的长度。
第二行是一个长度为的、仅含有 '( '和 ')' 这两种字符的字符串。
输出描述
如果能在有限次操作将字符串变成匹配的,请输出最少的操作次数。
否则输出-1
示例1
输入:
4 ()))
输出:
1
说明:
将第三个括号翻转,字符串变成 "()()" ,为匹配的。示例2
输入:
1 (
输出:
-1
说明:
翻转后字符串变成")",显然不可能匹配。C(clang11) 解法, 执行用时: 40ms, 内存消耗: 1276K, 提交时间: 2021-02-22 13:23:32
#include<stdio.h> int main() { int n,a=0,b=0,t=0;char c; scanf("%d",&n); if(n%2!=0) printf("-1\n"); else{scanf("%c",&c); while(n--) { scanf("%c",&c); if(c=='(') a++; else if(c==')'&&a==b) {a++;t++;} else b++; } t=t+(a-b)/2; printf("%d\n",t); } return 0; }
Python3 解法, 执行用时: 381ms, 内存消耗: 11200K, 提交时间: 2022-09-20 16:03:57
n=int(input()) s1=str(input()) if n%2!=0: print(-1) else: s2=0 s3=[] for i in range(n): if s1[i]=='(': s3.append('(') else: if len(s3)>0: s3.pop() else: s2+=1 s3.append('(') s2+=len(s3)//2 print(s2)
C++(clang++11) 解法, 执行用时: 9ms, 内存消耗: 1272K, 提交时间: 2021-02-22 17:46:32
#include<bits/stdc++.h> char a[1000010],c; int k1,k2; int main(){ int n; int i,j; scanf("%d%c",&n,&c); scanf("%s",&a); if(n%2)printf("-1"); else { for(i=0;i<n;i++) if (a[i]=='(') k1++; else if(k1>0)k1--; else if(k1==0){k1++;k2++;} printf("%d",k2+k1/2); } }