栈 贪心

方法一栈

括号问题一般采用栈来解决,建立一个左括号栈和一个星号栈,从左到右遍历,如果遇到左括号或者星号则直接入栈,遇到右括号,优先找左括号栈,如果左括号么有则找星号栈。当遍历完一边之后,如果左括号栈没有元素那么刚好,否则就要试着用星号作为右括号和左括号匹配。可以匹配的条件是星号的的下标要大于左括号的下标。

参考代码

  1. class Solution:
  2. def checkValidString(self, s: str) -> bool:
  3. left, star = [], []
  4. for i in range(0,len(s)):
  5. c = s[i]
  6. if c == '(':
  7. left.append(i)
  8. elif c == '*':
  9. star.append(i)
  10. else:
  11. if left:
  12. left.pop()
  13. elif star:
  14. star.pop()
  15. else:
  16. return False
  17. while left:
  18. c = left.pop()
  19. if star and star.pop() > c:
  20. pass
  21. else:
  22. return False
  23. return True

复杂度分析

时间复杂度 O(n)
空间复杂度 O(n)

方法二贪心

从左到右遍历一边,确保搜有的右括号都要匹配上。从右到左再遍历一边确保所有左括号都匹配上,左右括号都匹配上了那么就是匹配上了,否则就是不匹配

参考代码

  1. class Solution:
  2. def checkValidString(self, s: str) -> bool:
  3. left, star = 0,0
  4. for c in s:
  5. if c == '(':
  6. left+= 1
  7. elif c == '*':
  8. star += 1
  9. elif left:
  10. left -= 1
  11. elif star:
  12. star -= 1
  13. else: return False
  14. right, star = 0,0
  15. for c in reversed(s):
  16. if c == ')':
  17. right += 1
  18. elif c == '*':
  19. star += 1
  20. elif right:
  21. right -= 1
  22. elif star:
  23. star -= 1
  24. else: return False
  25. return True

复杂度分析

时间复杂度 O(n)
空间复杂度 O(1)