文字 char の配列が与えられた場合、次のアルゴリズムを使用して圧縮します。
圧縮文字列 s は個別に返されるのではなく、入力文字配列 chars に格納される必要があります。 10 以上のグループ長は chars 内の複数の文字に分割されることに注意してください。
入力配列の変更が完了したら、配列の新しい長さを返します。
一定の追加スペースのみを使用するアルゴリズムを作成する必要があります。
この問題を解決するには、現在の文字とその数を追跡しながら配列を反復処理する必要があります。新しい文字に遭遇すると、現在の文字とその数 (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; }
総当りのソリューションはスペース効率が悪く、一定の追加スペースのみを使用するという制約を満たしません。
最適化されたソリューションには、圧縮バージョンを保存するために入力配列を適切に変更することが含まれます。 2 つのポインターを使用します。1 つは入力配列の読み取り用、もう 1 つは圧縮出力の書き込み用です。
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; }
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 コーディング クロニクル: 文字列圧縮の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。