SPL(php标准库)提供了
SplStack
双链表结构类作为栈的实现类,也可用数组简单替代
栈特点
- 先进后出
- 不像列表,有去无回,栈可返回,即天生具备回退功能
- 栈由于一直是在一端操作,因此适合判断成双成对的场景匹配,当全部取完意味为空全部匹配
删除最外层括号
有效括号字符串为空 ("")、"(" + A + “)” 或 A + B,其中 A 和 B 都是有效的括号字符串,+ 代表字符串的连接。例如,"","()","(())()" 和 “(()(()))” 都是有效的括号字符串。
如果有效字符串 S 非空,且不存在将其拆分为 S = A+B 的方法,我们称其为原语(primitive),其中 A 和 B 都是非空有效括号字符串。
给出一个非空有效字符串 S,考虑将其进行原语化分解,使得:S = P_1 + P_2 + … + P_k,其中 P_i 是有效括号字符串原语。
对 S 进行原语化分解,删除分解中每个原语字符串的最外层括号,返回 S 。
输入:"(()())(())"
输出:"()()()"
解释:
输入字符串为 "(()())(())",原语化分解得到 "(()())" + "(())",
删除每个部分中的最外层括号后得到 "()()" + "()" = "()()()"。
方案
用数组实现
function removeOuterParentheses($S) {
$stack = [];
$str ="";
for($i=0;$i<strlen($S);$i++){
if(empty($stack)){
$j=$i;
}
if($S[$i]=="("){
array_push($stack,"(");
}else{
array_pop($stack);
}
if(empty($stack)){
if($j+1!=$i){
$str.=substr($S,$j+1,$i-$j-1);
}
}
}
return $str;
}
SplStack
SplStack类通过使用一个双向链表来提供栈的主要功能。
function spl_stack($S){
$str = "";
$stack = new SplStack;
for ($i=0;$i<strlen($S);$i++) {
if($stack->isEmpty()){
$j=$i;
}
if ($S[$i]=="(") {
$stack->push("(");
}else{
$stack->pop();
}
if($stack->isEmpty()){
$str.=substr($S,$j+1,$i-$j-1);
}
}
return $str;
}
golang版
import "container/list"
func removeOuterParentheses(S string) string {
stack := list.New()
b :=[]byte{}
j:=0
for i:=0;i<len(S);i++{
if stack.Len()==0 {
j=i
}
if S[i]== S[0] {
stack.PushBack(struct{}{})
}else{
stack.Remove(stack.Back())
}
if stack.Len()==0 {
b = append(b,S[j+1:i]...)
}
}
return string(b)
}
python版
def removeOuterParentheses(self, S: str) -> str:
k=0
l = []
rs =""
for i in range(len(S)):
if len(l)==0:
k = i
if S[i]=="(":
l.append(i)
else:
l.pop()
if len(l)==0:
rs+=S[k+1:i]
return rs