题解 | 小苯的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人适合做什么工作##我是面试官,请用一句话让我破防#
全部评论

相关推荐

迷茫的大四🐶:价格这么低都能满了?
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务