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

Python에서 문자열의 모든 부분 문자열의 고유 문자 수를 계산하는 프로그램

<시간/>

소문자 문자열 s가 있다고 가정하고 s의 모든 하위 문자열에서 고유한 문자 수의 합을 찾아야 합니다. 답이 매우 크면 결과 모드 10^9+7을 반환합니다.

따라서 입력이 s ="xxy"와 같으면 하위 문자열과 해당 개수가 -

이므로 출력은 6이 됩니다.
  • "x" :1

  • "x" :1

  • "y" :1

  • "xx" :0("x"는 구별되지 않음)

  • "xy" :2

  • "xxy" :1("x"가 구별되지 않기 때문에)

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

  • m :=10^9 + 7

  • prev_seen :=새로운 빈 지도

  • 답변 :=0

  • util() 함수를 정의합니다. 이것은 i, 기호가 필요합니다.

  • prev_seen[symbol] :=단일 값이 -1인 목록

  • prev :=prev_seen[기호]

  • 이전

    끝에 i 삽입
  • 이전 크기> 2인 경우

    • left :=prev의 첫 번째 요소 및 prev에서 첫 번째 요소 삭제

    • 가운데 :=이전[0], 오른쪽 :=이전[1]

    • cnt :=(가운데 - 왼쪽) *(오른쪽 - 가운데)

    • ans :=(ans + cnt) 모드 m

  • s의 각 인덱스 i와 값 기호에 대해 수행

    • 유틸리티(i, 기호)

  • prev_seen의 각 기호에 대해 수행

    • util(s의 크기, 기호)

  • 반환

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

예시

class Solution:
   def solve(self, s):
      m = 10 ** 9 + 7
      prev_seen = {}
      ans = 0
      def util(i, symbol):
         nonlocal ans
         prev = prev_seen.setdefault(symbol, [−1])
         prev.append(i)
         if len(prev) > 2:
            left = prev.pop(0)
            middle, right = prev
            cnt = (middle − left) * (right − middle)
            ans = (ans + cnt) % m
      for i, symbol in enumerate(s):
         util(i, symbol)
      for symbol in prev_seen:
         util(len(s), symbol)
      return ans
ob = Solution()
s = "xxy"
print(ob.solve(s))

입력

xxy

출력

6