PHP 最长有效括号长度(栈相关)-LeetCode 32

427 阅读3分钟

「这是我参与11月更文挑战的第19天,活动详情查看:2021最后一次更文挑战

今天说一下如何找出最长有效(格式正确且连续)括号子串的长度,LeetCode 32

Snipaste_2021-11-19_20-54-19.png

实现思路

找出最长有效括号字串的长度,比验证整个字符串是否有效要复杂的多。

验证整个字符串是否有效,只要有一个不符合规则,就可以判断出来。

而找出最长有效括号字串的长度需要遍历整个字符串。

有效括号字串存在于不符合规则的子串中间,我们需要统计每一个符合规则的子串的长度,然后比较大小,才能得出最长有效括号字串的长度。当然也可以在不断的遍历中就确定最大子串长度。同时也要判断并排除不符合规则的子串。

那么如何判断给定字符串中有效的括号子串长度呢?

我们遍历字符串的时候,每个字符的下表都是连续递增的。我们通过栈,维护每个字符的下标,通过判断一个符合规则的括号字串的首尾下标得到子串的长度。

具体做法是我们用数组表示一个栈结构,首先把一个值-1放入数组中,代表一个占位,因为当一个符合规则的括号子串都入栈、出栈之后,数组就为空,我们就无法判断这个子串的第一个开始字符的下表位置,从而无法得到整个子串的长度。同时当遇到右括号,并且数组为空时,我们需要把这个右括号的下表放入数组中,代表下个符合规则子串的开始位置。

代码讲解

Snipaste_2021-11-19_23-34-30.png

第227-230行代码,判断给定字符串长度小于1,则返回 0。

第232行代码,定义一个数组表示栈结构,并放入一个初始元素-1,表示某一个符合规则括号子串的前一个位置下标。

第233行代码,定义有效括号长度。

第235-236行代码,判断字符属于左括号,则把当前位置的下表放入数组内,遍历字符串时,第一个字符的下标是从 0 开始的。

第238行代码,字符属于 右括号 的时候,我们首先去掉数组内最后一个元素。

第239-240行代码,当数组为空时,我们把当前右括号的下标放入数组中,代表下个符合规则子串的开始位置。

第243-243行代码,我们用当前位置的下标减去数组内最后一个元素的值,就可以得到当前一个符合规则括号子串的长度,然后在于记录有效括号长度的变量进行比较,那个数值大,则复制给$manLength

这样一直遍历完整个字符串就可以得到最长有效括号长度。