由于我们只能忽略所有字母数字字符,因此从现在开始,我们将假定字符串仅包含括号。就像在问题中一样,只有一种括号“()”。
如果我们一直删除平衡括号,直到无法再删除平衡括号,则所有剩余的括号必须看起来像“))...((...(”,它们都是不平衡括号。此观察结果表明,我们应该首先找到该转折点,在此之前,我们仅具有不平衡的右括号,而在此之后,我们仅具有不平衡的右括号。
这是算法。简而言之,它首先计算转折点。然后输出额外的结束括号,从右到右扫描字符串直到转折点。对称地,它输出额外的左括号,从末端到左侧扫描直到转折点。
str
n
初始化turning_point=0, maximum_count=0, count=0
。对于每个i
from 0
,n-1
请执行以下操作。
- 如果
str[i] = ')'
加上1 count
; 否则,减去1。
- 如果
count > maximum_count
,设置turning_point=i
和maximum_count=count
。
现在turning_point
是转折点的索引。
复位maximum_count=0, count=0
。对于每个i
from 0
,turning_point
请执行以下操作。
- 如果
str[i] = ')'
加上1 count
; 否则,减去1。
- 如果
count > maximum_count
设置maximum_count = count
。输出i
为不平衡右括号的索引。
复位maximum_count=0, count=0
。对于每个i
从下n-1
到turning_point+1
下的操作,请执行以下操作。
- 如果
str[j] = '('
加上1 count
; 否则,减去1。
- 如果
count > maximum_count
设置maximum_count = count
。输出i
为不平衡的左括号的索引。
O(n)O(1)O(u)u
如果我们分析了上面的算法,我们将会发现,实际上,我们根本不需要查找和使用转折点。很好的观察是,所有不平衡的右括号都发生在所有不平衡的右括号之前,尽管这很有趣,但可以忽略不计。
只需点击“运行”即可查看几个测试结果。
练习1.显示以上算法将输出一组基数最小的括号,以使其余括号保持平衡。
问题1.我们可以将算法推广到字符串包含“()[]”之类的两种括号的情况吗?我们必须确定如何识别和处理新情况,即交错情况“([])”。