题目描述
定义如下规则序列(字符串):
1.空序列是规则序列;
2.如果S是规则序列,那么(S)和[S]也是规则序列;
3.如果A和B都是规则序列,那么AB也是规则序列。
例如,下面的字符串都是规则序列:
(),[],(()),([]),()[],()[()]
而以下几个则不是:
(,[,],)(,()),([()
现在,给你一些由‘(’,‘)’,‘[’,‘]’构成的序列,你要做的,是补全该括号序列,即扫描一遍原序列,对每一个右括号,找到在它左边最靠近它的左括号匹配,如果没有就放弃。在以这种方式把原序列匹配完成后,把剩下的未匹配的括号补全。
题目翻译
扫描一遍原序列,当找到一个右括号(即找到一个 ’ ) ’ 或者 ’ ] ’ 时),以它为起点向左找,找到一个没被标记成功匹配的左括号(即找到一个 ’ ( ’ 或者 ’ [ ’ ),如果两者匹配的话,标记它们成功 牵手 匹配,如果不匹配,或者找不到左括号的话,不做任何标记。上面扫描一遍标记完成功匹配的括号之后,扫描一遍序列,对于标记过的括号,则直接输出;对于没有标记的括号,则补全成对输出。
输入格式
输入文件仅一行,全部由‘(’,‘)’,‘[’,‘]’组成,没有其他字符,长度不超过100。
输出格式
输出文件也仅有一行,全部由‘(’,‘)’,‘[’,‘]’组成,没有其他字符,把你补全后的规则序列输出即可。
题解
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
String []a = scan.nextLine().split("");
int []b = new int[a.length];
scan.close();
for(int i=0;i<a.length;i++) {
if(a[i].equals("]")) {
for(int j=i-1;j>=0;j--) {
if(a[j].equals("[")&&b[j]!=1) {
b[i]=1;b[j]=1;
break;
}else if (a[j].equals("(") && b[j] == 0) break;
}
}
if(a[i].equals(")")) {
for(int j=i-1;j>=0;j--) {
if(a[j].equals("(")&&b[j]!=1) {
b[i]=1;b[j]=1;
break;
}else if (a[j].equals("[") && b[j] == 0) break;
}
}
}
for(int i=0;i<a.length;i++) {
if(b[i]==1) {
System.out.print(a[i]);
}else {
if(a[i].equals("[")||a[i].equals("]")) {
System.out.print("[]");
}
if(a[i].equals("(")||a[i].equals(")")) {
System.out.print("()");
}
}
}
}
}