题解 | 小苯的IDE括号问题(easy)
小苯的IDE括号问题(easy)
https://www.nowcoder.com/practice/5e5c72d72a4443adb44b5118acc5f371
import java.io.*;
import java.util.*;
/**
* 通过双栈模拟光标左右字符,结合高效 IO,将所有操作的时间复杂度降至 O (1) 级,彻底解决超时问题。
**/
public class Main {
public static void main(String[] args) throws IOException {
// 最早用StringBuilder超时使用BufferedReader提升输入效率
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
PrintWriter out = new PrintWriter(System.out);
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
int k = Integer.parseInt(st.nextToken());
String s = br.readLine();
int cursorPos = s.indexOf('I');
// 用双向队列模拟栈,左侧栈和右侧栈
Deque<Character> left = new ArrayDeque<>();
Deque<Character> right = new ArrayDeque<>();
// 初始化左侧栈(光标左边的字符)
for (int i = 0; i < cursorPos; i++) {
left.push(s.charAt(i));
}
// 初始化右侧栈(光标右边的字符,逆序存入,栈顶为光标右侧第一个字符)
for (int i = s.length() - 1; i > cursorPos; i--) {
right.push(s.charAt(i));
}
// 处理k次操作
for (int i = 0; i < k; i++) {
String op = br.readLine();
if ("backspace".equals(op)) {
// 检查是否处于匹配括号中间
if (!left.isEmpty() && !right.isEmpty()
&& left.peek() == '(' && right.peek() == ')') {
left.pop(); // 删除左侧'('
right.pop(); // 删除右侧')'
} else {
// 否则删除左侧字符(若存在)
if (!left.isEmpty()) {
left.pop();
}
}
} else if ("delete".equals(op)) {
// 检查是否处于匹配括号中间
if (!left.isEmpty() && !right.isEmpty()
&& left.peek() == '(' && right.peek() == ')') {
right.pop(); // 删除右侧')'
} else {
// 否则删除右侧字符(若存在)
if (!right.isEmpty()) {
right.pop();
}
}
}
}
// 构建结果字符串
StringBuilder sb = new StringBuilder();
// 左侧栈需反转(因为栈是逆序存储的)
while (!left.isEmpty()) {
sb.append(left.pop());
}
sb.reverse();
// 添加光标
sb.append('I');
// 右侧栈直接拼接(存储时已保证顺序)
while (!right.isEmpty()) {
sb.append(right.pop());
}
out.println(sb.toString());
out.flush();
}
}
#秋招许愿,本周能____##字符串##算法##i人适合做什么工作##我是面试官,请用一句话让我破防#