Computer >> 컴퓨터 >  >> 프로그램 작성 >> Python

Python에서 두 개의 유효한 괄호 문자열의 최대 중첩 깊이

<시간/>

문자열이 있다고 가정하고 해당 문자열은 "(" 및 ")" 문자로만 구성되고 이러한 속성을 충족하는 경우에만 유효한 괄호 문자열(VPS로 표시)입니다 -

  • 빈 문자열이거나

  • AB로 쓸 수 있습니다. 여기서 A와 B는 VPS 또는

  • (A)로 쓸 수 있습니다. 여기서 A는 VPS입니다.

우리는 또한 아래와 같이 모든 VPS S의 중첩 깊이 깊이(S)를 정의할 수 있습니다 -

  • 깊이("") =0

  • 깊이(A + B) =깊이(A)의 최대값, 깊이(B), 여기서 A와 B는 VPS

  • depth("(" + A + ")") =1 + depth(A), 여기서 A는 VPS입니다.

VPS seq가 있는 경우 A와 B가 VPS(및 A의 길이 + B의 길이 =seq의 길이)가 되도록 두 개의 분리된 하위 시퀀스 A와 B로 분할해야 합니다. 이제 max(depth(A), depth(B))가 가능한 최소값이 되도록 A와 B를 선택하면 됩니다. 그런 다음 A와 B의 선택을 인코딩하는 응답 배열(seq 길이)을 찾아야 합니다. seq[i]가 A의 일부이면 answer[i] =0, 그렇지 않으면 answer[i] =1.

따라서 입력이 "()(())()"과 같으면 출력은 [1,1,1,0,1,0,1,1]

이 됩니다.

이 문제를 해결하기 위해 다음 단계를 따릅니다. −

  • n :=seq의 길이, res :=길이가 n인 0의 배열

  • c1, c2 :=0, 0

  • 0 ~ n – 1 범위의 i에 대해

    • seq[i] ='('

      인 경우
      • c1

    • 그렇지 않으면

      • c1> c2이면 c1을 1만큼 감소시키고 그렇지 않으면 c2를 1만큼 감소시키고 res[i]:=1

  • 반환 해상도

이해를 돕기 위해 다음 구현을 살펴보겠습니다. −

예시

class Solution(object):
   def maxDepthAfterSplit(self, seq):
      n = len(seq)
      res = [0] *n
      c1,c2= 0,0
      for i in range(n):
         if seq[i] == '(':
            if c1<c2:
               c1+=1
         else:
            c2+=1
            res[i]=1
      else:
         if c1>c2:
            c1-=1
         else:
            c2-=1
            res[i]=1
   return res
ob = Solution()
print(ob.maxDepthAfterSplit("()(())()"))

입력

"()(())()"

출력

[1, 1, 1, 0, 1, 0, 1, 1]