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

Python에서 대괄호로 묶인 부분 문자열을 반전시키는 프로그램

<시간/>

문자와 괄호 "(" 및 ")"가 포함된 소문자 문자열이 있다고 가정합니다. 괄호로 묶인 모든 문자열을 재귀적 방식으로 뒤집고 결과 문자열을 반환해야 합니다.

따라서 입력이 s ="back(aps)ce"와 같으면 출력은 "backspace"가 됩니다.

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

  • 함수 trav() 를 정의합니다. 이것은 s, dir, start, close:=close, ans:=ans

    가 필요합니다.
    • end :="(" dir이 -1과 같으면, 그렇지 않으면 ")"

    • other :="(" 끝이 ")"와 같으면 ")"

    • start

      • s[start]가 other와 같으면

        • trav(s, -dir, 닫기[기타, 시작] - dir)

        • 시작 :=닫기[기타, 시작] + 디렉토리

      • 그렇지 않으면

        • ans의 끝에 s[start] 삽입

        • 시작 :=시작 + 디렉토리

  • 주 기능에서 다음을 수행하십시오 -

  • ans :=새 목록

  • close :=")" 및 "(" 키를 포함하는 새 맵 처음에 값은 두 개의 빈 맵입니다.

  • 스택 :=새 목록

  • s의 각 인덱스 I 및 값 c에 대해 수행

    • c가 "("와 같으면

      • i를 스택에 푸시

    • 그렇지 않으면 c가 ")"와 같을 때

      • o :=스택의 맨 위, 스택에서 팝

      • 닫기[")", i] :=o

      • 닫기["(", o] :=i

  • 트래브(들, 1, 0)

  • 빈 문자열과 결합하여 반환

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

예시

class Solution:
   def solve(self, s):
      ans = []
      close = {")": {}, "(": {}}
      stack = []
      for i, c in enumerate(s):
         if c == "(":
            stack.append(i)
         elif c == ")":
            o = stack.pop()
            close[")"][i] = o
            close["("][o] = i
      def trav(s, dir, start, close=close, ans=ans):
         end = "(" if dir == -1 else ")"
         other = "(" if end == ")" else ")"
         while start < len(s) and s[start] != end:
            if s[start] == other:
               trav(s, −dir, close[other][start] − dir)
               start = close[other][start] + dir
            else:
               ans.append(s[start])
               start += dir
      trav(s, 1, 0)
      return "".join(ans)
ob = Solution()
print(ob.solve("back(aps)ce"))

입력

"back(aps)ce"

출력

backspace