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

【C++】文字列内の各文字から指定した文字までの最短距離を求める方法

文字列 a と特定の文字 char が与えられたとき、文字列内の各文字から char までの距離を出力するのが本記事のテーマです。出力する距離配列のサイズは元の文字列と同じになります。これは、文字列内のすべての文字について、対象となる文字までの距離を求める必要があるためです。

入力例と出力例

例1

a = "tutorialspoint"
char = "o"

出力:

[3, 2, 1, 0, 1, 2, 3, 3, 2, 1, 0, 1, 2, 3]

この文字列では「o」はインデックス3とインデックス10の2箇所に存在します。各位置から最も近い「o」までの距離を計算すると、上記のような配列が得られます。

例2

a = "programmer"
char = "r"

出力:

[1, 0, 1, 1, 0, 1, 2, 2, 1, 0]

「r」はインデックス1、4、9に出現するため、文字列内の各文字からの最短距離は上記の配列となります。

問題を解くためのアプローチ

この問題に対する最もシンプルな解法(全探索)は、まず文字列内における指定文字の出現位置をすべて配列に記録し、その後、文字列全体を走査しながら各位置と出現位置との距離の最小値を求める方法です。

  • 文字列と文字 char を入力として受け取ります。
  • 関数 shortestToChar(string a, char ch) は、文字列と文字を引数に取り、文字列内の各文字から指定文字までの距離を出力します。
  • 文字列 a を走査し、指定文字が出現する位置をベクター(動的配列)に格納します。
  • 続いて文字列と出現位置の配列を走査し、各文字から指定文字までの最小距離を計算します。
  • 最後に、結果の距離配列を出力します。

C++での実装例

#include<bits/stdc++.h>
using namespace std;
void shortestToChar(string a, char C) {
    vector < int > pos, dist;
    for (int i = 0; i < a.size(); i++) {
        if (a[i] == C)
            pos.push_back(i);
    }
    for (int i = 0; i < a.size(); i++) {
        int mn = INT_MAX;
        for (int j = 0; j < pos.size(); j++) {
            mn = min(mn, abs(pos[j] - i));
        }
        dist.push_back(mn);
    }
    for (auto i: dist) {
        cout << i << " ";
    }
}
int main() {
    string a = "tutorialspoint";
    char ch {
        'o'
    };
    shortestToChar(a, ch);
}

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

出力

3 2 1 0 1 2 3 3 2 1 0 1 2 3

文字列「tutorialspoint」において、文字「o」はインデックス3とインデックス10に存在します。そのため、前後の各文字から最も近い「o」までの距離を計算すると、[3 2 1 0 1 2 3 3 2 1 0 1 2 3] という結果になります。

なお、この手法の時間計算量は O(n × k) です(n は文字列の長さ、k は指定文字の出現回数)。文字列が非常に長い場合は、左方向と右方向からの2回の走査で各位置の最短距離を求めることで、O(n) まで計算量を抑える最適化も可能です。

  1. C++で三角形の重心を求めるプログラムの作成方法

    この記事では、三角形の3つの頂点の座標を格納した2次元配列が与えられたときに、その三角形の重心を求めるC++プログラムの作成方法を解説します。 三角形の重心とは、三角形の3本の中線がすべて交わる点のことです。 また、三角形の中線とは、ある頂点と、その対辺(向かい合う辺)の中点を結ぶ線分のことを指します。 それでは、具体的な例を使って問題を確認してみましょう。 入力 (-3, 1), (1.5, 0), (-3, -4) 出力 (-1.5, -1) 説明 重心 (x, y) = ((-3 + 1.5 - 3) / 3, (1 + 0 - 4) / 3) = (-1.5, -1) 解法のアプロ

  2. C++で平行四辺形の面積を求めるプログラムの作成方法

    この記事では、平行四辺形の底辺と高さを表す2つの値が与えられたとき、C++を使ってその面積を求めるプログラムを作成する方法を解説します。 平行四辺形とは? 平行四辺形とは、4つの辺からなる閉じた図形であり、向かい合う2組の辺がそれぞれ長さが等しく、互いに平行になっている四角形のことです。 問題を理解するための具体例 入力 B = 20, H = 15 出力 300 説明 平行四辺形の面積 = 底辺 × 高さ = 20 × 15 = 300 解決アプローチ この問題を解くには、平行四辺形の面積を求める幾何学の公式を使用します。 面積 = 底辺 × 高さ つまり、与えられた底辺と高さを掛け合わせ