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

Python에서 가장 긴 청크 회문 분해의 길이를 찾는 프로그램

<시간/>

텍스트가 있다고 가정해 보겠습니다. 다음과 같이 a[1], a[2], ..., a[k]가 존재하는 가능한 가장 큰 k를 찾아야 합니다. 각 a[i]는 공백이 아닌 문자열입니다. 그리고 연결 a[1] + a[2] + ... + a[k]는 주어진 텍스트와 같습니다. 범위 1에서 k까지의 모든 i에 대해 a[i] =a[{k+1 - i}].

따라서 입력이 text ="antprezatepzapreanta"와 같으면 "a|nt|a|pre|za|tpe|za|pre|a|nt|a"와 같이 분할할 수 있기 때문에 출력은 11이 됩니다.

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

  • 카운터 :=0

  • i :=1, j :=텍스트 크기 - 1

  • ic :=0, jc :=텍스트 크기

  • 동안 나는 <=j, 수행

    • 텍스트의 하위 문자열[인덱스 ic에서 i-1까지]이 텍스트의 하위 문자열[인덱스 j에서 jc-1까지]과 동일한 경우

      • 카운터 :=카운터 + 2

      • ic :=나는

      • jc :=j

    • 나는 :=나는 + 1

    • j :=j - 1

  • ic이 jc와 같지 않으면

    • 카운터 :=카운터 + 1

  • 반환 카운터

예시

더 나은 이해를 위해 다음 구현을 살펴보겠습니다.

def solve(text):
   counter = 0
   i, j = 1, len(text) - 1
   ic, jc = 0, len(text)

   while i <= j:
      if text[ic:i] == text[j:jc]:
         counter += 2
         ic = i
         jc = j
      i += 1
      j -= 1

   if ic != jc:
      counter += 1

   return counter

text = "antaprezatepzapreanta"
print(solve(text))

입력

[3,4,5,2,1,7,3,4,7], 3

출력

11