列表

详情


NC213474. 贪玩的二小姐(续)

描述

芙兰朵露拿到了一个只含有 '(' 和 ')' 这两种字符的字符串。芙兰想玩一玩这个字符串。

现在将字符串括号匹配定义如下:

  1. 空字符串: "" 是匹配的。
  2. 若字符串是匹配的,那么 "(s)" 是匹配的。
  3. 若字符串都是匹配的,字符串 "st" 是匹配的。

例如,"(()())" 是匹配的 , "())(()"则不是匹配的。
芙兰朵露每一次操作可以将括号翻转,即把左括号变成右括号,或者把右括号变成左括号。
她想知道将给定的字符串变成匹配的,需要最少的操作次数是多少?

输入描述

第一行一个正整数,代表给定字符串的长度。
第二行是一个长度为的、仅含有 '( '和 ')' 这两种字符的字符串。

输出描述

如果能在有限次操作将字符串变成匹配的,请输出最少的操作次数。
否则输出-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);
  }
} 

上一题