括号序列:
定义如下规则(字符串)
1.空序列是规则序列;
2.如果S是规则序列,那么(S)和[S]也是规则序列;
3.如果A和B都是规则序列,那么AB也是规则序列.
例如,下面的字符串都是规则序列;
(),[],(()),([]),()[],()[()]
这几个则不是规则序列:
(,[,],)(,([()
现在,给出一些由'(',')','[',']'构成的序列,请添加尽量少的括号,得到一个规则序列.
可用递归:
import
java.io.
*
;
class Test2
... {
public static void main(String[] args) throws Exception
...{
BufferedReader bf=new BufferedReader(new InputStreamReader(System.in));
String str=null;
while((str=bf.readLine())!=null)
...{
char a[]=new char[str.length()];
str.getChars(0,str.length(),a,0);
System.out.println(go(Integer.MAX_VALUE,a,0,a.length-1));
}
}
public static int go(int answer,char a[],int i,int j)throws Exception
...{
if(i>j)return 0;
else if(i==j)return 1;
else
...{
if(a[i]=='('&&a[j]==')'||a[i]=='['&&a[j]==']')
answer=getMin(answer,go(answer,a,1+i,j-1));
if(a[i]=='('||a[i]=='[')
answer=getMin(answer,go(answer,a,i+1,j)+1);
if(a[j]==')'||a[j]==']')
answer=getMin(answer,go(answer,a,i,j-1)+1);
}
for(int k=i;k<j;k++)
answer=getMin(answer,go(answer,a,i,k)+go(answer,a,k+1,j));
return answer;
}
public static int getMin(int a,int b)
...{
return a>b?b:a;
}
}
class Test2
... {
public static void main(String[] args) throws Exception
...{
BufferedReader bf=new BufferedReader(new InputStreamReader(System.in));
String str=null;
while((str=bf.readLine())!=null)
...{
char a[]=new char[str.length()];
str.getChars(0,str.length(),a,0);
System.out.println(go(Integer.MAX_VALUE,a,0,a.length-1));
}
}
public static int go(int answer,char a[],int i,int j)throws Exception
...{
if(i>j)return 0;
else if(i==j)return 1;
else
...{
if(a[i]=='('&&a[j]==')'||a[i]=='['&&a[j]==']')
answer=getMin(answer,go(answer,a,1+i,j-1));
if(a[i]=='('||a[i]=='[')
answer=getMin(answer,go(answer,a,i+1,j)+1);
if(a[j]==')'||a[j]==']')
answer=getMin(answer,go(answer,a,i,j-1)+1);
}
for(int k=i;k<j;k++)
answer=getMin(answer,go(answer,a,i,k)+go(answer,a,k+1,j));
return answer;
}
public static int getMin(int a,int b)
...{
return a>b?b:a;
}
}