2381。シフトする文字 II
難易度: 中
トピック: 配列、文字列、プレフィックス合計
英小文字の文字列 s と 2D 整数配列シフトが与えられます。ここで、shifts[i] = [starti、endi、directioni]。すべての i について、s 内の文字をインデックス開始iからインデックス終了i (包括的) 方向シフトします。 🎜>i = 1、または方向i = の場合は文字を後方にシフトします。 0.
文字を前方にシフトすることは、アルファベットの次の文字に置き換えることを意味します(「z」が「a」になるように折り返す)。同様に、文字を 後方 に移動することは、その文字をアルファベットの 前の 文字に置き換えることを意味します ('a' が 'z' になるように折り返す)。
s へのすべてのシフトが適用された後の最後の文字列を返します。
例 1:
例 2:
制約:
ヒント:
解決策:
シフトごとに文字を 1 つずつシフトすることは避ける必要があります。これは、大量の入力に対して遅すぎるためです。代わりに、prefix sum と呼ばれる手法を活用することで、より最適なアプローチを使用できます。
このソリューションを PHP で実装してみましょう: 2381。シフトする文字 II
説明:
- 各シフト [開始、終了、方向] について、開始時にシフト配列をインクリメントし、終了 1 でデクリメントします。これにより、シフト範囲の開始と終了を追跡できます。
- すべてのシフトを処理した後、シフト配列にプレフィックスの合計を適用して、各インデックスでの累積シフトを取得します。
- 最後に、文字列内の各文字に累積シフトを適用します。
コードの説明:
- 入力解析: 操作を容易にするために、入力文字列 s を文字の配列に変換します。
- シフト配列: サイズ n 1 のシフト配列をゼロに初期化します。この配列はシフト効果を追跡するために使用されます。シフト [開始、終了、方向] ごとに、シフトの開始と終了を反映するために、shift[start] と SHIFT[END 1] の値を調整します。
- Prefix Sum: シフト配列を反復処理し、シフトの累積合計を維持することにより、各文字の合計シフトを計算します。
- 文字シフト: 文字列内の各文字について、式 (ord(currentChar) - ord('a') totalShift) % 26 を使用して最終的にシフトされた文字を計算します。これは、文字列の循環的な性質を説明します。アルファベット。
- 戻り結果: 最終的な文字列は、文字配列を文字列に変換して返し、それを返すことによって取得されます。
時間計算量:
このソリューションは、入力制約の上限があっても問題を効率的に処理します。
連絡先リンク
このシリーズが役立つと思われた場合は、GitHub で リポジトリ にスターを付けるか、お気に入りのソーシャル ネットワークで投稿を共有することを検討してください。あなたのサポートは私にとって大きな意味を持ちます!
このような役立つコンテンツがさらに必要な場合は、お気軽にフォローしてください:
以上がシフトする文字 IIの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。