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

C++でXより大きい数値を表す部分文字列の個数を数える方法

0から9までの数字のみで構成される文字列が与えられます。この文字列は1つの10進数を表しているとみなします。ここでの目的は、数値 X よりも大きな値を表す部分文字列がいくつあるかを求めることです。ただし、部分文字列の先頭が「0」で始まってはならないという条件があります。たとえば元の文字列が「2021」の場合、「02」「021」「0」のように先頭が0から始まる部分文字列は候補から除外されます。

この問題は、各開始位置の先頭文字をチェックするだけで効率的に解けます。先頭の文字が「0」以外であれば、そこから始まる部分文字列はすべて有効な候補になります。あとは stoi() を使って部分文字列を整数に変換し、その値が X より大きいかどうかを判定してカウントを増やしていきます。

それでは、具体的な例で確認してみましょう。

入出力例

入力: str = "123"、X = 12
出力: Xより大きい数値を表す部分文字列の個数: 2
説明: 12より大きい部分文字列は「123」と「23」の2つです。

入力: str = "111"、X = 100
出力: Xより大きい数値を表す部分文字列の個数: 1
説明: 100より大きいのは「111」だけです。

プログラムで使用するアプローチ

  • 数字のみで構成された文字列 str を受け取ります。
  • 文字列の長さを len = str.length() として保存します。
  • 関数 greater_X(string str, int x) は、文字列を受け取り、Xより大きい10進数を表す部分文字列の個数を返します。
  • forループで文字列を左から右へ走査します。
  • インデックス i = 0 から i < len まで順に処理します。
  • str[i] が '0' 以外であれば、その位置から始まるすべての部分文字列が有効な候補になります。
  • 部分文字列の長さ j を 1 から i + j <= len まで変化させながら試します。
  • 部分文字列 str.substr(i, j) を stoi() で整数に変換し、その値が X より大きければ count をインクリメントします。
  • 最終的な count を結果として返します。

C++による実装例

#include <bits/stdc++.h>
using namespace std;
int greater_X(string str, int x){
    int count = 0;
    int len = str.length();
    for (int i = 0; i < len; ++i){
        if(str[i] != '0'){
            for (int j=1; (i + j) <= len; ++j){
                if (stoi(str.substr(i, j)) > x){
                    count++;
                }
            }
        }
    }
    return count;
}
int main(){
    string str = "987";
    int x = 100;
    cout<<"Count of number of substrings with numeric value greater than X are: "<<greater_X(str, x);
    return 0;
}

出力結果

上記のコードを実行すると、次の出力が得られます。

Count of number of substrings with numeric value greater than X are: 1

計算量と注意点

この手法では、開始位置と部分文字列の長さの組み合わせをすべて調べるため、時間計算量は O(n²) となります(nは文字列の長さ)。また、stoi() は int 型に変換するため、非常に長い部分文字列を変換するとオーバーフローが発生する可能性がある点に注意してください。桁数が多い数値を扱う場合は、stoll() を使うか、文字列の長さ比較を組み合わせて大小関係を判定するなどの工夫が必要になります。

  1. C++で整数文字列に含まれる6の倍数となる部分文字列の個数を効率的に求める方法

    本記事では、数字のみで構成された文字列が与えられたとき、その中に6で割り切れる部分文字列がいくつ含まれるかを求める問題を解説します。入力は数字の文字列として与えられますが、6で割り切れるかどうかの判定は、文字コード(ASCII値)ではなく、整数として扱って行う点に注意してください。問題の例入力:str = 648出力:3説明:部分文字列「6」「48」「648」が6で割り切れます。入力:str = 38342出力:4説明:部分文字列「3834」「342」「834」「42」が6で割り切れます。全探索(ブルートフォース)によるアプローチ最もシンプルな方法は、取り得るすべての部分文字列を生成し、それぞ

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