컴퓨터 과학에서 문자열 조작은 접합, 하위 문자열 및 반전과 같은 작업과 관련된 중요한 주제입니다. 문자열 조작과 관련된 일반적인 문제는 이진 문자열에서 모든 0을 제거하는 것입니다. 이 기사에서는 이 문제를 해결하기 위해 인접하지 않은 쌍 뒤집기를 최소한으로 사용하는 알고리즘에 대해 설명합니다.
이진 문자열이 주어지면 인접하지 않은 쌍 뒤집기의 최소 횟수를 사용하여 문자열에서 모든 0을 제거해야 합니다. 뒤집기는 인접한 두 문자를 선택하고 바꾸는 것으로 정의됩니다. 즉, 문자열의 모든 0을 문자열 끝으로 가져오는 데 필요한 최소 뒤집기 횟수를 찾아야 합니다.
그리디 알고리즘을 사용하여 이 문제를 해결할 수 있습니다. 문자열의 왼쪽에서 시작하여 0을 끝까지 뒤집은 마지막 인덱스를 추적할 수 있습니다. 0이 발견될 때마다 그 위치를 마지막으로 뒤집힌 0과 바꿔 문자열의 끝으로 이동합니다. 1이 발생하면 간단히 다음 인덱스로 이동합니다.
알고리즘을 자세히 살펴보겠습니다 -
두 변수 "lastFlipped"와 "flipCount"를 각각 -1과 0으로 초기화합니다.
바이너리 문자열을 왼쪽에서 오른쪽으로 탐색합니다.
현재 문자가 "0"이면 인덱스 "lastFlipped + 1"에 있는 문자로 바꾸고 "lastFlipped" 변수를 증가시킵니다.
각 스왑 작업에 대해 "flipCount" 변수를 증가시킵니다.
순회가 완료된 후 모든 0은 문자열 끝에 있게 되며 "flipCount"에는 모든 0을 제거하는 데 필요한 최소 뒤집기 횟수가 포함됩니다.
위 알고리즘을 구현하는 데 사용된 C++ 코드입니다. -
으아악이진 문자열 “100101000”을 예로 들어 보겠습니다. 인접하지 않은 쌍 뒤집기의 최소 횟수를 사용하여 문자열에서 모든 0을 제거해야 합니다.
처음에는 "lastFlipped"와 "flipCount"가 각각 -1과 0으로 설정됩니다.
왼쪽에서 오른쪽으로 문자열을 탐색하기 시작합니다.
인덱스 1에서 '0'을 발견합니다. 이를 인덱스 "lastFlipped + 1"(즉, 인덱스 0)에 있는 문자로 바꾸고 "lastFlipped"를 0으로 증가시킵니다. 문자열은 "010101000"이 됩니다. "flipCount"가 1로 증가합니다.
인덱스 4에서 또 다른 '0'을 발견합니다. 이를 인덱스 "lastFlipped + 1"(즉, 인덱스 1)에 있는 문자로 바꾸고 "lastFlipped"를 1로 늘립니다. 문자열은 "011010000"이 됩니다. "flipCount"가 2로 증가합니다.
인덱스 5에서 '1'을 발견합니다. 다음 색인으로 이동합니다
이 기사에서는 인접하지 않은 쌍 뒤집기의 최소 횟수를 사용하여 이진 문자열에서 모든 0을 제거하는 알고리즘에 대해 설명합니다. 이 알고리즘에서 사용하는 접근 방식은 탐욕적이므로 효율적이고 구현하기 쉽습니다. 또한 샘플 테스트 사례와 함께 알고리즘을 구현하기 위한 C++ 코드도 제공합니다.
이 문제는 동적 프로그래밍을 사용하여 해결할 수도 있지만 그리디 알고리즘이 더 간단하고 빠른 솔루션을 제공합니다. 이 알고리즘의 시간 복잡도는 O(n)입니다. 여기서 n은 이진 문자열의 길이입니다.
요약하자면, 최소 비인접 쌍 뒤집기 알고리즘은 문자열 연산에 유용한 도구이며 다양한 상황에 적용될 수 있습니다.
위 내용은 이진 문자열을 오름차순으로 정렬하기 위해 제거해야 하는 최소 문자 수의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!