1 括号字符串最短长度计算
问题描述
小F拿到了一串只包含 '(' 和 ')' 的括号字符串。她可以进行以下两种操作:
- 将相邻的一对括号
'()'合并为'('。 - 将相邻的一对括号
'()'合并为')'。
小F想知道,经过若干次操作后,能够将这个括号字符串的长度缩短到最小,最短的长度是多少?
思路
用栈来进出括号进行匹配。维护一个保存字符的栈。 如果是左括号,直接进栈,等待右括号的匹配。 如果是右括号,首先需要判别栈是否为空,栈为空直接进栈。 栈不为空的时候,判断有没有左括号,一个右括号能消一连串的左括号,就是匹配后合并为一个新的右括号,就又可以进行消除。 当栈里还有左括号的时候,每次消除合并都选择右括号。 当所有的左括号都消除后,必须合并为左括号,以便和后面的右括号合并。
代码1
一开始是这么写的,但是总感觉在判断右括号进出栈上面,代码里很多重复的判断,很冗余。但是又不能消除,所以感觉还是栈即进左括号又进右括号的原因。
def solution(s: str) -> int:
stack = [] # 记录未配对的左括号数量
for char in s:
if char == '(':
stack.append(char)
elif char == ')':
if stack and stack[-1] == '(':
while stack and stack[-1] == '(':
stack.pop()
stack.append('(')
continue
stack.append(char)
return len(stack)
if __name__ == '__main__':
print(solution("((") == 2)
print(solution(")(") == 2)
print(solution("((()))") == 1)
后来想想还是需要保持栈完全是(,使用一个新的变量来另外记录匹配不上的右括号数目。 这样对栈判空即可,不需要判断栈顶元素是左括号还是右括号,也不需要有额外的进栈操作。
def solution(s: str) -> int:
stack = [] # 记录未配对的左括号数量
rstack = 0
for char in s:
if char == '(':
stack.append(char)
elif char == ')':
if not stack:
rstack+=1
else:
while stack :
stack.pop()
stack.append('(')
return len(stack) + rstack
2 相邻重复字母删除
问题描述
小M拿到了一个由小写字母组成的字符串 s。她发现可以进行一种操作:选择两个相邻且相同的字母并删除它们。她可以在 s 上反复进行此操作,直到无法再删除任何字母。
请返回最终处理完所有重复项删除操作后的字符串。可以保证返回的答案是唯一的。
思路
就是维护一个栈保存当前字符串,每有字符进栈的时候,和栈顶元素匹配一下即可。匹配不上则进栈,匹配上了弹出栈顶元素。 可以说是名副其实的简单题啊,和中等无关啊。
代码
def solution(s: str) -> str:
# write code here
stack = []
for char in s:
if stack and stack[-1] == char:
stack.pop()
else:
stack.append(char)
return ''.join(stack)
if __name__ == '__main__':
print(solution(s="abbaca") == 'ca')
print(solution(s="azxxzy") == 'ay')
print(solution(s="a") == 'a')