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()

相关推荐
YLCHUP1 天前
【思维&图论建模】题解:债权(debt)_图论_建模_思路转化_思维题目_C++算法竞赛
c++·笔记·算法·数学建模·贪心算法·深度优先·图论
海绵宝宝转agent13 天前
LeetCode100 二叉树个人题解
算法·leetcode·深度优先
CQU_JIAKE14 天前
10.31[A]
算法·深度优先
海绵宝宝转agent15 天前
LeetCodehot100题解
java·笔记·学习·算法·leetcode·深度优先
海绵宝宝转agent16 天前
Leetcode二叉树算法个人理解
笔记·学习·算法·leetcode·深度优先
海绵宝宝转agent17 天前
Leetcode100+面经
java·笔记·学习·算法·leetcode·深度优先
mjhcsp18 天前
Code date creation v8.0 竞赛数据生成与对拍实战指南
算法·ai·深度优先·cdc
wdfk_prog18 天前
LWIP教程 40:从 `socket()` 到 `lwip_socket()`——DFS fd、SAL Socket 与 lwIP Backend
算法·深度优先
NEFU_Jyj22 天前
牛客周赛R166(max型瓶颈最短路,前后缀DP合并)
算法·深度优先
?abc!24 天前
(动态规划+DFS)494. 目标和
算法·深度优先·动态规划