反转每对括号间的子串 | Java刷题打卡

174 阅读1分钟

本文正在参加「Java主题月 - Java 刷题打卡」,详情查看 活动链接

一、题目描述:

image.png

二、思路分析:

今天给大家分享的是一道medium的题目,反转每对括号间的子串。题意是给一个字符串S,里面只包含小写英文字母和括号,括号保证是成对且正确匹配的,现在需要你对括号中的子串依次反转,并返回最后的结果,结果不包含括号。看到这道题,第一印象就是用栈来做。

使用栈来做

  • 直接栈模拟就行。
  • 遇到 非 ) 直接入栈。
  • 遇到 ) ,开始出栈,直到遇到 ( ,把这之间的元素反转后再入栈
  • 最后把栈内元素链接起来就行。

另一种思路

可以参考文章我按照题意话了个遍历流程图,差不多是下面的。可以用一次遍历完成,不过还比较难想的,当作扩展吧. image.png

三、AC 代码:

image.png

//直接弄
function reverseParentheses($s) {
        $len_s = strlen($s);
        $stack = new SplStack();
        for ($i = 0; $i < $len_s; $i++) {
            $cur = $s[$i];
            if ($cur != ")") {
                $stack->push($cur);
            } else {
                $temp = new SplQueue();
                while ($stack->top() != "(") {
                    $temp->enqueue($stack->pop());
                }
                $stack->pop();
                while (!$temp->isEmpty()) {
                    $stack->push($temp->dequeue());
                }
            }
        }

        $ret = iterator_to_array($stack);
        //var_dump($ret);

        return join("", array_reverse($ret));
    }

四、总结:

遇到括号的题目,一般可以往栈的思路上走一走,一般会有奇效