C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++で文字列の末尾に到達するために必要な最大ジャンプ力を求める方法

このチュートリアルでは、文字列の末尾に到達するために必要な最大ジャンプ力(パワー)を求めるプログラムについて解説します。

ここで扱う問題は、0と1のみで構成された文字列が与えられ、「現在位置と同じ要素に移動できる」という条件のもとで、文字列の先頭から末尾へ移動する際に必要となる最大ジャンプ力を求めるというものです。

アルゴリズムの考え方

ポイントとなるのは、文字列の最後の文字です。移動できるのは「現在位置と同じ要素」のみなので、実質的には最後の文字と同じ文字の位置だけを踏み台として進んでいくことになります。したがって、隣り合う同じ文字同士の間隔を数え、その最大値が答えとなります。

実装例

#include<bits/stdc++.h>
using namespace std;
// 最大ジャンプ力を求める関数
int powerOfJump(string s) {
    int count = 1;
    int max_so_far = INT_MIN;
    char ch = s[s.length() - 1];
    for (int i = 0; i < s.length(); i++) {
        if (s[i] == ch) {
            if (count > max_so_far) {
                max_so_far = count;
            }
            count = 1;
        }
        else
            count++;
    }
    return max_so_far;
}
int main(){
    string st = "1010101";
    cout<<powerOfJump(st);
}

出力

2

コードの解説

上記のコードでは、まず文字列の最後の文字を変数 ch に取得します。続いて文字列を先頭から走査し、ch と一致する文字を見つけるたびに、前回一致した位置からの距離(カウント)を記録します。この距離がこれまでの最大値 max_so_far より大きければ更新し、カウントを1に戻して次の区間の計測に備えます。

例として「1010101」という文字列を考えてみましょう。最後の文字は「1」であり、「1」の出現位置の間隔はすべて2です。そのため、実行結果として 2 が出力されます。

このアルゴリズムの計算量は文字列の長さを n とすると O(n) であり、非常に効率的です。

  1. C++で配列内のプレフィックス(接頭辞)の最大出現回数を求める方法

    この問題では、すべて小文字から構成される文字配列が与えられます。私たちのタスクは、配列内で最も多く出現するプレフィックス(接頭辞)を見つけることです。具体的には、出現回数が最大となる空でないプレフィックスについて、その出現回数を数える必要があります。問題を理解するための例入力 : string = xyyzkxyyzk 出力 : 2解法のアプローチこの問題の鍵となるのは、次のシンプルな発想です。配列のプレフィックスは必ず文字列の最初の文字を含みます。繰り返し出現するプレフィックスも同様に、必ず先頭の文字を持っています。また、文字列の最初の文字そのものは、文字数が1だけの最短のプレフィックスです

  2. C++で文字列の部分文字列の総数を求める方法を解説

    この記事では、与えられた文字列から作成できる空でない部分文字列の個数を求める方法について解説します。入力 : string = "moon" 出力 : 10 説明 : 部分文字列は m、o、o、n、mo、oo、on、moo、oon、moon の 10 個です。 入力 : string = "yellow" 出力 : 21解法のアプローチ文字列の長さを n とします。上の例からも分かるように、考えられるすべての部分文字列の個数を求めるには、長さ n、(n-1)、(n-2)、(n-3)、……2、1 の部分文字列の個数を順に加算していく必要があります。部分文