AC:0/3,score=0.2

又被血虐。

第一题:

题目:

image.png

答案:

  1. class Solution:
  2. def solve(self , str ):
  3. stack=[str[0]]
  4. n=len(str)
  5. if n==1:return str
  6. for i in range(1,n):
  7. if str[i]=="1":
  8. if stack and stack[-1]=="1":
  9. stack.pop()
  10. else:
  11. stack.append(str[i])
  12. else:
  13. if stack and stack[-1]=="0":
  14. if len(stack)>1 and stack[-2]=="1":
  15. stack.pop()
  16. stack.pop()
  17. else:
  18. stack.pop()
  19. stack.append("1")
  20. else:
  21. stack.append(str[i])
  22. return "".join(stack)

思路:

模拟栈就行了,出栈的时候只会影响前一个。

第二题:

题目:

image.png

答案:

  1. class Solution:
  2. def solve(self , n , m , limit ):
  3. # write code here
  4. def dfs(i):
  5. if i==n+1:
  6. for p in limit:
  7. if p.x in visit and p.y in visit:
  8. return
  9. self.ans+=1
  10. return
  11. visit.add(i)
  12. dfs(i+1)
  13. visit.remove(i)
  14. dfs(i+1)
  15. self.ans=0
  16. visit=set()
  17. dfs(1)
  18. return self.ans

思路:

怎么说呢,这个回溯法,我好像怎么又像从来没写过一样,写了半天。
每次递归的时候是,选不选这个数,所以递归两次,递归的出口,我这里是n+1
当然可以对 visit 做预处理,但是这里visit只有400,我觉得不会影响复杂度。
这题的预处理也可以用位运算压缩,但是速度上还是对 visit 做预处理更快。

第三题:

题目:

image.png

答案:

  1. class Solution:
  2. def solve(self , n , k , s ):
  3. # write code here
  4. from collections import Counter
  5. s = Counter(s)
  6. def judge(x):
  7. out = {}
  8. cur = 0
  9. for j in s:
  10. out[j] = s[j] // x
  11. cur += out[j]
  12. if cur < k:
  13. return []
  14. res = []
  15. rest = k
  16. for j in sorted(out):
  17. if out[j] >= rest:
  18. res.extend([j]*rest)
  19. return res
  20. else:
  21. res.extend([j]*out[j])
  22. rest -= out[j]
  23. for i in range(n//k, 0, -1):
  24. ans = judge(i)
  25. if ans:
  26. return ans

思路:

思路我和大佬是一样的,用Counter 去倒叙遍历 子集的套数,找到符合的就返回(一定会找到,只要n>=k),但是这个代码大佬写的也太好了,超越不了了。