第一题:有效的括号
本题用到的知识点:栈(stack)和哈希表
题目描述:
解题思路:
- 左括号必须以正确的顺序和右括号闭合,比如“[ ( { } ) ] ",这样:[ ( { ) } ] 虽然对应每种左括号都能找到右括号,但是并不能以正确的顺序进行闭合。
- 最左边的左括号要和最右边的右括号匹配,将左括号从栈中移除,这符合先进后出的顺序。
题解:
1.构建一个哈希表,将括号匹配成键值对存放在哈希表中。
2.使用栈,通过遍历循环字符串将左边的括号压入栈中,将右括号与左括号进行配对看是否成功。
class Solution:
def isValid(self, s: str) -> bool:
dic={'(':')','{':'}','[':']','#':'#'}
stack=['#']
for i in s:
if i in dic:
stack.append(i)
else:
if dic[stack.pop()]!=i:
return False
return len(stack)==1
注意点:
如果一开始碰到的是右括号,那需要从栈中弹出一个值和该右括号进行匹配,但如果此时栈(列表)是空的就会报错,所以让栈初始的时候就有一个值,在字典中也有该值的键值对。
复杂度:
最多遍历循环一遍字符串,复杂度为O(n).
第二题:删除最外层的括号
题目:
题目意思就是要删除最外层的括号,留下里边的。
解题思路:
该题和第一题有相似之处:
准备一个空栈stack和结果字符串str,遍历循环输入的字符串,遇到左括号'(' 入栈,遇到右括号')' 则将栈顶元素弹出。栈从空到空的过程就是遍历循环到一个大括号的过程,我们只需要将最外层括号之外的内容添加到结果字符串str中。
难点:怎样哪个是判断最外层的括号?
最外层的左括号一定是第一个入栈的,此时栈的长度为1,那也一定是最后一个出栈的,此时栈的长度还是1,所以根据栈的长度是否大于1来决定是否要将遍历到的字符添加到结果字符串中。
代码:
class Solution:
def removeOuterParentheses(self, s: str) -> str:
str,stack='',[]
for i in s:
if i =='(':
stack.append(i)
if len(stack)>1:
str+=i
if i==')':
stack.pop()
return str
注意要先判断栈的长度是否大于一,在进行出栈判断。
时间复杂度:
最多只需要遍历循环字符串,时间复杂度为O(n)。
第三题:删除字符串中所有相邻的重复项。
题目:
解题思路:
1.最开始想使用遍历字符串,看相邻项元素是否相等,如果相等,就删除对应下标的元素。
但是字符串遍历下标都是越来越大,并不能实现。
2.正确解决方法:用栈来解决。遍历循环字符串,将字符串的元素压入栈中,如果栈顶元素和遍历的元素相同,那么将该元素出栈。最后将栈中的元素转化成字符串。
代码:
class Solution:
def removeDuplicates(self, s: str) -> str:
stack=['#']
for i in s:
if stack[-1]==i:
stack.pop()
else:
stack.append(i)
res=''.join(stack[1:])
return res
(第一道没有看题解就写出来的!!)写这个解法的难点就是:刚开始的栈是空的,怎样写条件语句让元素压入栈中,如果直接判断stack[-1]==i ,这个时候列表为空,会发生列表超出范围。所以初始化列表的值不为空。
代码改进:
看了题解发现,可以在判断语句stack[-1]==i 时,再加一项列表不为空,如果列表为空就直接将元素入栈。
class Solution:
def removeDuplicates(self, s: str) -> str:
stack=[]
for i in s:
if stack and stack[-1]==i:
stack.pop()
else:
stack.append(i)
res=''.join(stack)
return res
复杂度:
时间复杂度:O(n)
第四题:删除子串后的字符串的最小长度。
题目:
题解:
这道题我觉得和括号匹配思路一样,不多赘述。
class Solution:
def minLength(self, s: str) -> int:
stack=[]
for i in s:
if stack and i=='B':
if stack[-1]=='A':
stack.pop()
else:
stack.append(i)
elif stack and i=='D':
if stack[-1]=='C':
stack.pop()
else:
stack.append(i)
else:
stack.append(i)
return len(stack)