(注:题解来自于“今日头条校园”微信公众号)
题意:给定一个合法的括号序列,以字符矩阵的形式翻转后输出。
题解:先预处理每一个括号的深度,从而推出应打印的括号的大小,剩下的就是扫一遍处理下打印细节了。
Java代码实现:
import java.util.LinkedList;
import java.util.List;
public class Test {
// 括号绘制函数,numDraw用于控制绘制长度
// drawFlag 控制绘制类型:true表示这一行的中间是--- false表示这一行的中间是空格
public static String drawBracket(int numDraw, boolean drawFlag, int maxLevel) {
String result = "";
int drawWidth = (maxLevel - numDraw) * 2;
// 绘制对齐用的空格
for (int i = 0; i < numDraw - 1; i++) {
result += " ";
}
// 绘制主体(绘制一行的左端)
result += "|";
// 如果drawFlag 为true,则绘制一行(比如: +-----+)
if (drawFlag) {
result += "+";
for (int i = 0; i < drawWidth - 1; i++) {
result += "-";
}
result += "+";
} else {
// 如果drawFlag 为false,则绘制空格(比如: )
for (int i = 0; i < drawWidth + 1; i++) {
result += " ";
}
}
result += "|";
return result;
}
// 边缘线绘制函数,参数用于控制绘制的长度
public static String drawLine(int numDrawLine, int maxLevel) {
String result = "";
// 绘制对齐用的空格
for (int i = 0; i < numDrawLine; i++) {
result += " ";
}
int drawWidth = (maxLevel - numDrawLine) * 2;
// 绘制直线主体
result += "+";
for (int i = 0; i < drawWidth - 1; i++) {
result += "-";
}
result += "+";
return result;
}
public static void main(String[] args) {
String strInput = "[[[][[]]]][]";
int length = strInput.length();
// 数据预处理
char strLeft = '[';
char strRight = ']';
// 最大嵌套层数
int maxLevel = 0;
int tempLevel = 0;
List<Integer> levelList = new LinkedList<Integer>();
// 在最前面多加了一个0!
levelList.add(0);
for (int i = 0; i < length; i++) {
if (tempLevel > maxLevel) {
maxLevel = tempLevel;
}
if (strInput.charAt(i) == strLeft) {
tempLevel += 1;
}
if (strInput.charAt(i) == strRight) {
tempLevel -= 1;
}
levelList.add(tempLevel);
}
for (int i = 0; i < levelList.size(); i++) {
// 括号边缘判断,首尾的括号边缘只需要绘制一次,内部的边缘绘制两次
if (levelList.get(i) == 0) {
// 如果是第一个或者最后一个,单独处理
if (i == 0 || i == length) {
System.out.println(drawLine(0, maxLevel));
} else {
System.out.println(drawLine(0, maxLevel));
System.out.println(drawLine(0, maxLevel));
}
} else {
// 如果不是括号边缘
// 判断是否为最小括号组,如果是,绘制括号组;否则绘制边缘
if (strInput.charAt(i - 1) == strLeft && strInput.charAt(i) == strRight) {
System.out.println(drawBracket(levelList.get(i), false, maxLevel));
System.out.println();
System.out.println(drawBracket(levelList.get(i), false, maxLevel));
} else {
if (strInput.charAt(i - 1) == strRight && strInput.charAt(i) == strLeft) {
System.out.println(drawLine(levelList.get(i), maxLevel));
System.out.println(drawLine(levelList.get(i), maxLevel));
} else {
System.out.println(drawBracket(levelList.get(i), true, maxLevel));
}
}
}
}
}
}