【C++】文字列から作成可能な長さnの部分文字列の個数を求める方法
文字列str[]と整数nが与えられたとき、str[]から取り出すことのできる「長さnの部分文字列」が全部でいくつあるかを求めるのがこの問題の狙いです。例えば、文字列が「abcde」でn=3の場合、長さ3の部分文字列は「abc」「bcd」「cde」の3つとなり、個数は3になります。
具体例で理解する
入力: str[] = "computer"、n = 4
出力: 与えられた文字列から作成可能な長さnの部分文字列の個数は 5
解説: 長さ4の部分文字列は「comp」「ompu」「mput」「pute」「uter」の5つです。
入力: str[] = "development"、n = 5
出力: 与えられた文字列から作成可能な長さnの部分文字列の個数は 7
解説: 長さ5の部分文字列は「devel」「evelo」「velop」「elopm」「lopme」「opmen」「pment」の7つです。
プログラムのアプローチ
文字列str[]の長さをLとすると、str[]内に含まれる長さnの部分文字列の個数は「L − n + 1」で求められます。例えば、文字列「abcdefghi」(L=9)でn=4の場合、部分文字列は「abcd」「bcde」「cdef」「defg」「efgh」「fghi」の6つとなり、9 − 4 + 1 = 6で計算結果と一致します。これは、長さnの部分文字列の開始位置が0からL−nまでのL−n+1通りしかないためです。
文字列strを受け取ります。
nを整数として受け取ります。
関数possible_substring(string str, int length, int n)は、文字列とその長さ、nを受け取り、長さnの部分文字列の個数を返します。
変数countを用意し、count = length − n + 1 を設定します。
最後にcountを結果として返します。
なお、nが文字列長より大きい場合には作成できる部分文字列が存在しないため、実用的なコードではcountが負の値にならないようチェックを追加しておくとより安全です。
コード例
#include <bits/stdc++.h>
using namespace std;
int possible_substring(string str, int length, int n){
int count = length - n + 1;
return count;
}
int main(){
string str = "learning";
int length = str.length();
int n = 2;
cout<<"Count of substrings of length n possible from the given string are: "<<possible_substring(str, length, n);
return 0;
}
出力
上記のコードを実行すると、以下の出力が得られます。
Count of substrings of length n possible from the given string are: 7
-
C++でグリッド内の指定方向に実行可能な移動回数をカウントする方法
サイズ n × m のグリッドと、開始座標 (x, y) を表す変数が与えられます。さらに、グリッド内を移動するために使用できるステップのペア(例:(1,1)、(2,2) など)も与えられます。各ペアは、x 軸と y 軸方向に進む単位移動量を表します。ゴールは、境界 [1, n] × [1, m] の範囲内でグリッド内を移動できる合計ステップ数を求めることです。 たとえば、n = 5、m = 4、現在位置が (2, 2)、選択したステップが (1, -1) の場合を考えてみましょう。このステップを 1 回適用すると (3, 1) に移動できますが、もう 1 回適用すると (4, -1) となり
-
C++で指定サイズの長方形内に作成できる菱形の個数を数える方法
問題の概要 高さ×幅の寸法をもつ長方形が与えられます。この長方形は2次元座標系上に配置されており、左下の頂点が原点 (0,0) に位置します。今回の目的は、次のすべての条件を満たす菱形がこの長方形内にいくつ作れるかを数えることです。 菱形の面積が0より大きいこと。 菱形の対角線がx軸およびy軸に平行であること。 菱形のすべての頂点が整数座標を持つこと。 入出力例 入力:縦=3、横=3 出力:指定サイズの長方形内に作れる菱形の個数:4 説明:下の図は縦3×横3の長方形です。面積が0より大きく、対角線が両軸に平行で、頂点が整数座標である菱形が4つ存在します。 1つ目 [ (1,0), (2,1