java实战字符串3:反转每对括号间的子串,多个括号嵌套时,逐层反转


题目描述

给出一个字符串 s(仅含有小写英文字母和括号)。
请你按照从括号内到外的顺序,逐层反转每对匹配括号中的字符串,并返回最终的结果。

注意,您的结果中 不应 包含任何括号。

解答要求时间限制:1000ms, 内存限制:256MB 输入

输入为一行带有括号的字符串(只包含英文小写字母和左右小括号)
最大长度不会超过10000个字符

输出

反转括号内字符串并输出(只有英文小写字母)

样例1

输入

(abcd)

输出

dcba
样例 2

输入

(u(love)i)

输出

iloveu
样例 3

输入

(i(u(wa)e)h)

输出

huawei
样例 4

输入

a(bcdefghijkl(mno)p)q

输出

apmnolkjihgfedcbq

备注:当多括号嵌套时,内部括号里面的字母可能被多次反转,请仔细阅读几个示例!!

解答:

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String str = sc.nextLine();
        Stack sta = new Stack<>();
        Queue que = new LinkedList<>();// 接收每个括号中的元素
        for (int i = 0; i < str.length(); i++) {
            char cha = str.charAt(i);
            if (cha != ')') {
                sta.push(cha);
            } else {
                while (true) {
                    char tem = sta.pop(); // 对每个小括号中的元素进行反转
                    if (tem == '(')
                        break;
                    que.add(tem);
                }
            }
            if (i != str.length() - 1) {
                while (!que.isEmpty()) {
                    sta.push(que.poll());
                }
            }
        }
        // 结束循环时,结果是栈中结果加队列中的元素,注意栈中的元素出来后会被反转
        StringBuffer bf = new StringBuffer();
        while (!sta.isEmpty()) {
            bf.append(sta.pop());
        }
        bf.reverse();
        while (!que.isEmpty()) {
            bf.append(que.poll());
        }
        System.out.print(bf);
    }
}





相关