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

Python에서 문자열을 내림차순 연속 값으로 분할할 수 있는지 확인하는 프로그램

<시간/>

숫자만 있는 문자열 s가 있다고 가정합니다. 두 개 이상의 비어 있지 않은 부분 문자열로 분할할 수 있는지 여부를 확인하여 해당 부분 문자열의 숫자 값이 증가하지 않는 순서로 있고 모든 인접한 두 부분 문자열의 숫자 값 차이가 1이 되도록 해야 합니다. 예를 들어 다음과 같은 경우 문자열은 s ="0080079"이므로 숫자 값 [80, 79]를 사용하여 ["0080", "079"]로 나눌 수 있습니다. 그리고 값은 내림차순이고 인접한 값은 1만큼 다르므로 이 방법이 유효합니다. 위와 같이 분할이 가능한지 여부를 확인해야 합니다.

따라서 입력이 s ="080076"과 같으면 ["08", "007", "6"]과 같이 분할할 수 있으므로 출력은 True이므로 숫자 값은 [8,7,6]입니다. .

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

  • dfs() 함수를 정의합니다. s, pre, idx, n

    이 필요합니다.
  • pre가 -1이 아니고 (s[index idx to end]의 부분 문자열)의 정수 형식이 pre -1과 같으면

    • 참을 반환

  • 범위 1에서 n-idx-1까지의 i에 대해 수행

    • curs :=s의 부분 문자열[인덱스 idx에서 idx+i-1까지]

    • cur :=숫자로 저주

    • pre가 -1과 같으면

      • dfs(s, cur, idx+i, n)가 참이면

        • 참을 반환

      • 그렇지 않으면

        • cur가 pre-1과 같고 dfs(s, cur, idx+i, n)가 참이면

          • 참을 반환

  • 거짓을 반환

  • 기본 방법에서 다음을 수행하십시오.

  • n :=s

    의 크기
  • n <=1이면

    • 거짓을 반환

  • 반환 dfs(s, -1, 0, n)

예시

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

def dfs(s, pre, idx, n):
   if pre != -1 and int(s[idx:]) == pre - 1:
      return True
   for i in range(1, n-idx):
      curs = s[idx: idx+i]
      cur = int(curs)
      if pre == -1:
         if dfs(s, cur, idx+i, n):
            return True
      else:
         if cur == pre - 1 and dfs(s, cur, idx+i, n):
            return True
   return False

def solve(s):
   n = len(s)
   if n <= 1:
      return False
   return dfs(s, -1, 0, n)

s = "080076"
print(solve(s))

입력

"080076"

출력

True