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

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

この記事では、与えられた文字列から作成できる空でない部分文字列の個数を求める方法について解説します。

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 の部分文字列の個数を順に加算していく必要があります。

部分文字列の総数 = n + (n - 1) + (n - 2) + (n - 3) + ……. + 2 + 1

= n × (n + 1) / 2

これにより、文字列の長さ n を使って部分文字列の個数を計算する式が導かれました。

C++による実装

以下は、この問題を解くために使用できる C++ のコードです。

サンプルコード

#include<bits/stdc++.h>
using namespace std;
int main () {
    string str = "yellow";
    // 文字列の長さを求める
    int n = str.length();
    // 導出した式から結果を計算する
    int number_of_strings = n * (n + 1) / 2;
    cout << "Number of substrings of a string : " << number_of_strings;
    return 0;
}

実行結果

Number of substrings of a string : 21

コードの解説

これは、与えられた文字列から作成可能な部分文字列の個数を求めるための、最も効率的でシンプルなアプローチです。

まずコード内では、length() 関数を使って文字列の長さを取得し、その値を先ほど導出した式に代入します。そして、結果を格納した変数の値を出力として表示します。

まとめ

この記事では、文字列に含まれる部分文字列の個数を求める方法を解説しました。まず、すべての可能な部分文字列の個数を求める式を導出し、文字列の長さをもとにその式から結果を得る流れを紹介しました。同じプログラムは、C、Java、Python など他の言語でも記述することができます。この記事が皆さんのお役に立てば幸いです。

  1. C++で列車の停車駅の組み合わせ数を求める方法

    地点XとYの間にはn個の中間駅があるとします。ここで、「どの2つの停車駅も隣り合わない」という条件のもとで、s個の駅に停車する列車の配置方法が何通りあるかを求める問題を考えてみましょう。この記事では、停車駅の組み合わせ数を求めるためのアプローチを段階的に詳しく解説します。この問題は、本質的には組合せ論の問題であり、s個の停車駅の選び方の総数を求めることになります。 問題を解くアプローチ まず具体例として、中間駅が8個あり、そのうち3個の駅に停車させたい場合を考えてみます。 n = 8, s = 3 このとき、列車が停車できない駅は(n − s)、つまり5個残ることになります。 停車できない

  2. C++で集合の反射関係の数を求める方法

    この記事では、C++を使って集合上に定義できる反射関係(reflexive relation)の総数を求める方法について解説します。問題設定としては、整数 n が与えられたとき、n 個の自然数からなる集合上に存在する反射関係の個数を求めるというものです。 反射関係とは 集合 A 上の関係 R が反射的であるとは、「A に属するすべての要素 a に対して、順序対 (a, a) が必ず R に含まれる」という条件を満たすことを意味します。数式で表すと次のようになります。 (a, a) ∈ R (∀ a ∈ A) 具体的な入出力の例を見てみましょう。 入力 : x = 1 出力 : 1 説明 : 集