20200601

@zhangyuwei

Plan

leetcode 每日一题

Notes

  1. 移除无效的括号 给你一个由 '('、')' 和小写字母组成的字符串 s。 你需要从字符串中删除最少数目的 '(' 或者 ')' (可以删除任意位置的括号),使得剩下的「括号字符串」有效。 请返回任意一个合法字符串。 有效「括号字符串」应当符合以下 任意一条 要求: 空字符串或只包含小写字母的字符串 可以被写作 AB(A 连接 B)的字符串,其中 A 和 B 都是有效「括号字符串」 可以被写作 (A) 的字符串,其中 A 是一个有效的「括号字符串」

  示例 1:

输入:s = "lee(t(c)o)de)" 输出:"lee(t(c)o)de" 解释:"lee(t(co)de)" , "lee(t(c)ode)" 也是一个可行答案。 示例 2:

输入:s = "a)b(c)d" 输出:"ab(c)d" 示例 3:

输入:s = "))((" 输出:"" 解释:空字符串也是有效的 示例 4:

输入:s = "(a(b(c)d)" 输出:"a(b(c)d)"

解法:逻辑比较简单,用一个栈来保存左括号。遍历字符串:如果当前括号是右括号且栈中没有左括号,则该位置的右括号需要删除,记录该位置。如果当前括号是左括号,则入栈。遍历完成后,若栈中有多余的左括号,则从字符串从后往前记录是左括号的位置,直到栈为空。 需要注意的是: 1.因为go没有自带栈,所以需要使用slice+index模拟栈。index记录当前可以插入的位置。 2.删除的时候,先把需要删除的index数组排序,因为每删除一个,后面的index需要往前移动,所以需要一个变量记录已经删除的个数num,然后从index数组中取index后,将index-num,才是真正要删除的index。

More