문자 배열이 주어지면 다음 알고리즘을 사용하여 압축합니다.
압축된 문자열 s는 별도로 반환되지 않고 입력 문자 배열 chars에 저장되어야 합니다. 10자 이상의 그룹 길이는 문자 단위로 여러 문자로 분할됩니다.
입력 배열 수정을 완료한 후 배열의 새 길이를 반환합니다.
항상 추가 공간만 사용하는 알고리즘을 작성해야 합니다.
이 문제를 해결하려면 현재 문자와 그 개수를 추적하면서 배열을 반복해야 합니다. 새로운 문자를 만나면 현재 문자와 해당 문자 수(1보다 큰 경우)를 배열에 추가합니다. 공간 복잡성 요구 사항을 충족하려면 이 작업을 제대로 수행해야 합니다.
무차별 대입 솔루션에는 입력 배열의 압축된 버전을 저장할 새 배열을 만드는 것이 포함됩니다. 이는 공간 효율적이지는 않지만 관련 단계를 이해하는 데 도움이 됩니다.
function compressBruteForce(chars: string[]): number { const n = chars.length; let compressed: string[] = []; let i = 0; while (i < n) { let char = chars[i]; let count = 0; while (i < n && chars[i] === char) { i++; count++; } compressed.push(char); if (count > 1) { compressed.push(...count.toString().split('')); } } for (let j = 0; j < compressed.length; j++) { chars[j] = compressed[j]; } return compressed.length; }
무차별 솔루션은 공간 효율적이지 않으며 지속적인 추가 공간만 사용한다는 제약 조건을 충족하지 않습니다.
최적화된 솔루션에는 압축 버전을 저장하기 위해 입력 배열을 수정하는 작업이 포함됩니다. 우리는 두 개의 포인터를 사용합니다. 하나는 입력 배열을 읽기 위한 것이고 다른 하나는 압축된 출력을 쓰기 위한 것입니다.
function compress(chars: string[]): number { let writeIndex = 0; let i = 0; while (i < chars.length) { let char = chars[i]; let count = 0; // Count the number of consecutive repeating characters while (i < chars.length && chars[i] === char) { i++; count++; } // Write the character chars[writeIndex] = char; writeIndex++; // Write the count if greater than 1 if (count > 1) { let countStr = count.toString(); for (let j = 0; j < countStr.length; j++) { chars[writeIndex] = countStr[j]; writeIndex++; } } } return writeIndex; } <h3> 시간 복잡도 분석: </h3> <ul> <li> <strong>시간 복잡도:</strong> O(n), 여기서 n은 배열의 길이입니다. 문자 수를 세는 데 한 번, 결과를 쓰는 데 한 번 배열을 반복합니다.</li> <li> <strong>공간 복잡도:</strong> O(1), 변수에 대해 일정한 양의 추가 공간만 사용하기 때문입니다.</li> </ul> <h3> 기본 솔루션에 비해 개선된 사항: </h3> <ul> <li>최적화된 솔루션은 입력 배열을 제자리에서 수정하여 공간 복잡도를 O(1)로 줄입니다.</li> </ul> <h2> 엣지 케이스 및 테스트: </h2> <h3> 엣지 케이스: </h3> <ol> <li>배열에는 문자가 하나만 포함됩니다.</li> <li>배열에 연속된 반복 문자가 없습니다.</li> <li>배열에 다수의 연속된 반복 문자가 포함되어 있습니다.</li> </ol> <h3> 테스트 케이스: </h3> <pre class="brush:php;toolbar:false">console.log(compressBruteForce(["a","a","b","b","c","c","c"])); // 6, ["a","2","b","2","c","3"] console.log(compressBruteForce(["a"])); // 1, ["a"] console.log(compressBruteForce(["a","b","b","b","b","b","b","b","b","b","b","b","b"])); // 4, ["a","b","1","2"] console.log(compressBruteForce(["a","a","a","a","a","a","a","a","a","a"])); // 3, ["a","1","0"] console.log(compressBruteForce(["a","b","c"])); // 3, ["a","b","c"] console.log(compress(["a","a","b","b","c","c","c"])); // 6, ["a","2","b","2","c","3"] console.log(compress(["a"])); // 1, ["a"] console.log(compress(["a","b","b","b","b","b","b","b","b","b","b","b","b"])); // 4, ["a","b","1","2"] console.log(compress(["a","a","a","a","a","a","a","a","a","a"])); // 3, ["a","1","0"] console.log(compress(["a","b","c"])); // 3, ["a","b","c"]
문자열 조작:
내부 알고리즘:
이러한 문제와 전략을 연습함으로써 문제 해결 능력을 향상시키고 다양한 코딩 과제에 더 잘 대비할 수 있습니다.
위 내용은 Typescript Coding Chronicles: 문자열 압축의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!