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

Python에서 주어진 문자열에서 k개의 고유한 문자가 있는 가장 긴 부분 문자열 찾기


우리가 정확히 k개의 고유 문자를 가진 가장 긴 가능한 부분 문자열을 반환해야 하는 문자열이 있다고 가정하고, 가능한 가장 긴 부분 문자열이 두 개 이상 있으면 그 중 하나를 반환합니다.

따라서 입력이 s ="ppqprqtqtqt", k =3과 같으면 출력은 길이가 7이므로 rqtqtqt가 됩니다.

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

  • N :=26

  • is_ok() 함수를 정의합니다. 계산이 필요합니다. k

  • 값 :=0

  • 범위 0에서 N까지의 i에 대해 수행

    • count[i]> 0이면

      • 발값 :=발값 + 1

  • (k>=val)

    일 때 true를 반환합니다.
  • 기본 방법에서 다음을 수행하십시오 -

  • 고유 :=0, 크기 :=s의 크기

  • count :=크기가 N인 배열, 0으로 채움

  • 범위 0에서 크기까지의 i에 대해

    • s[i]의 개수가 0과 같으면

      • 고유 :=고유 + 1

    • s[i]의 수를 1 증가

  • 고유한 경우

    • 그런 문자가 없고 종료됩니다.

  • 시작 :=0, 종료 :=0

  • window_length :=1, window_start :=0

  • count :=크기가 N인 배열, 0으로 채움

  • s[0]의 수를 1 증가

  • 범위 1에서 크기까지의 i에 대해 수행

    • s[i]의 수를 1 증가

    • 끝 :=끝 + 1

    • is_ok(count, k)가 거짓인 동안 수행

      • s[i]의 수를 1로 감소

      • 시작 :=시작 + 1

    • end-start+1> window_length인 경우

      • window_length :=종료 시작+1

      • window_start :=시작

  • s[인덱스 window_start에서 window_start + window_length까지]

    의 하위 문자열을 반환합니다.

예시

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

N = 26
def is_ok(count, k):
   val = 0
   for i in range(N):
      if count[i] > 0:
         val += 1
   return (k >= val)
def k_unique_chars(s, k):
   unique = 0
   size = len(s)
   count = [0] * N
   for i in range(size):
      if count[ord(s[i])-ord('a')] == 0:
         unique += 1
      count[ord(s[i])-ord('a')] += 1
   if unique < k:
      return "Not sufficient characters"
   start = 0
   end = 0
   window_length = 1
   window_start = 0
   count = [0] * len(count)
   count[ord(s[0])-ord('a')] += 1
   for i in range(1,size):
      count[ord(s[i])-ord('a')] += 1
      end+=1
      while not is_ok(count, k):
         count[ord(s[start])-ord('a')] -= 1
         start += 1
      if end-start+1 > window_length:
         window_length = end-start+1
         window_start = start
   return s[window_start:window_start + window_length]

s = "ppqprqtqtqt"
k = 3
print(k_unique_chars(s, k))

입력

"ppqprqtqtqt", 3

출력

rqtqtqt