ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

10.3【A】

10.3【A】 32如果子串是有效的那么最终必定以右括号为结尾暴力法好的方法暂时想不出来先考虑暴力法即假设以每个字符为起点开始向后延申最后取MAX并辅以各种剪枝首先是起始必须是左括号然后左括号数量不能超过给定字符串s长度的一半进一步地应该是从此字符开始时剩余字符串长度的一半然后右括号数量不能超过左括号当子串的左右括号数量相等时就尝试更新一次结果每个起始位置结束的标志就是左括号数量超过剩余的一半或者右括号数量超过左括号数量没想到直接过了这里需要注意左括号数量打到一半时这个剩余子串的长度应该是要包含起始子串自身的即应该是n-i而不是n-i-1如果以下标i为开始的子串那么在其前面是有i个元素总共元素是有n个那么算上起点剩余的就是n-i个如果不算上起点那就是n-i-1个这个优化就是说不需要cur因为已经知道起点和有效时的终点那么直接算就行栈法为什么弹出后栈为空则当前的右括号是多余的他不是和刚从栈顶弹出的这个左括号所匹配了吗到这里就和滑动窗口差不多了就是用一个垫底哨兵了解释右括号是否还能继续加入以及标识下个可能有效的合法子串的起始位置是哪里但这个一定用不上因为合法子串一定以右括号为结尾那么与之对应的起始位置一定是栈里合法的未匹配左括号的下标那就是滑动窗口只不过是以栈来维护的滑动窗口当遇到左括号时就将其下标加入到栈中遇到右括号时看是否能和它匹配如果能就尝试更新否则就过就是说遇到右括号时不应当直接与其对应的左括号做匹配而是要利用其下标去找到合法子串开始时的那个下标来定位出整个合法子串的长度那这个就需要去记录合法字串开始时的那个不合法位置在哪如果右括号本身不合法那就需要令其自身作为栈底否则就需要尝试去看与之匹配的左括号下面一个是什么如果是栈底那就说明连续上了如果不是说明还有没匹配完的左括号然后对于数值的计算st.top()是不合法的位置st.top()1是合法的起点那么整体的长度就是i-(st.top()1)1即i-st.top()
返回列表