本文正在参加「Java主题月 - Java 刷题打卡」,详情查看 活动链接
一、题目描述:
二、思路分析:
今天给大家分享的是一道medium的题目,反转每对括号间的子串。题意是给一个字符串S,里面只包含小写英文字母和括号,括号保证是成对且正确匹配的,现在需要你对括号中的子串依次反转,并返回最后的结果,结果不包含括号。看到这道题,第一印象就是用栈来做。
使用栈来做
- 直接栈模拟就行。
- 遇到 非 ) 直接入栈。
- 遇到 ) ,开始出栈,直到遇到 ( ,把这之间的元素反转后再入栈
- 最后把栈内元素链接起来就行。
另一种思路
可以参考文章我按照题意话了个遍历流程图,差不多是下面的。可以用一次遍历完成,不过还比较难想的,当作扩展吧.
三、AC 代码:
//直接弄
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));
}
四、总结:
遇到括号的题目,一般可以往栈的思路上走一走,一般会有奇效