Back to Leetcode

Readme

Greedy/921.Minimum-Add-to-Make-Parentheses-Valid/Readme.md

latest1.5 KB
Original Source

921.Minimum-Add-to-Make-Parentheses-Valid

此题的贪心法比较容易理解。我们维护一个计数器count,表示是目前为止尚未被匹配的左括号的数目。

举个例子:s = (()))((

我们依次查看到((的时候,count=2,此时我们并不着急对s做任何改动,因为s后面还有字符,说不定这些左括号都能被匹配到。

我们继续查看到(())的时候,count=0,果然这时候的字符就是匹配的,我们依然不需要对s做任何改动。

我们继续查看到(()))的时候,count=-1,此时我们不得不出手。因为无论s后面的字符如何,都无法挽救当前这个无法被匹配的右括号。此时必须处理,即增加一个左括号与之匹配。至于放在哪里我们并不关心,总之有地方放就是了。注意,既然增加一个左括号,那么此时的count=0.

我们继续查看到(()))((的时候,count=2,字符串完结。对于这两个未被匹配的左括号,我们也必须处理,不得不增加两个右括号与之匹配。

回顾上述的过程,我们所有增加括号的操作都是必要操作。最终我们实现了count=0,意味着这个字符串此时已经合法了。所以之前的“必要操作”也是“充分操作”,就是最终解。

如果题目改成"Minimum delete to Make Parentheses Valid",答案其实一模一样。我们增加多少括号促成匹配,就等效于减少多少(对称的)括号促成匹配。