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

C++で2つの文字列に共通しない文字を検索する方法

このチュートリアルでは、C++を使って、与えられた2つの文字列の中から「片方にしか存在しない文字」を効率的に見つける方法を解説します。まずは具体例を見てみましょう。

入力例と出力例

入力

string_one = "tutorialspoint"
string_two = "tutorialsworld"

出力

d n p w

上記の例では、両方の文字列に共通して含まれる文字(t、u、o、r、i、a、l、s)を除き、どちらか一方にのみ存在する文字 d、n、p、w を出力しています。

解法のアプローチ

この問題はハッシュ(連想配列)を使うことで効率的に解けます。2重ループで全文字同士を比較する方法よりも計算量が少なく、パフォーマンス面で優れています。

解決手順

  • 2つの文字列を適当な値で初期化します。
  • map<char, int> 型のマップ chars を用意します。
  • 1つ目の文字列を走査し、各文字をキーとして値1でマップに挿入します。
  • 次に2つ目の文字列を走査します。
    • その文字がすでにマップに存在するかどうかを確認します。
    • 存在する場合は、共通文字であることを示すため値を0に更新します。
    • 存在しない場合は、新しい文字として値1で挿入します。
  • 最後にマップ全体を走査し、値が1の文字(=片方にしか存在しない文字)を出力します。

サンプルコード

以下が実際のコードです。

#include <bits/stdc++.h>
#include <map>
using namespace std;

void findDistinctCharacters(string one, string two){
    // 文字の出現状況を記録するマップを初期化
    map<char, int> chars;
    // 1つ目の文字列を走査
    for (int i = 0; i < one.size(); ++i){
        // 各文字をマップに挿入
        chars.insert({one[i], 1});
    }
    // 2つ目の文字列を走査
    for (int i = 0; i < two.size(); ++i){
        // 現在の文字がすでに登録されているか確認
        if (chars.count(two[i])) {
            // 共通文字には0を設定
            chars.find(two[i])->second = 0;
        }
        else {
            // 新しい文字を挿入
            chars.insert({two[i], 1});
        }
    }
    // 共通しない文字を出力
    for (auto item : chars){
        // 値が1の文字だけ出力
        if (item.second == 1) {
            cout << item.first << " ";
        }
    }
}

int main(){
    string one = "tutorialspoint";
    string two = "tutorialsworld";
    findDistinctCharacters(one, two);
    return 0;
}

実行結果

上記のコードを実行すると、次のような結果が得られます。

d n p w

まとめ

std::map を活用することで、2つの文字列をそれぞれ一度ずつ走査するだけで共通しない文字を抽出できました。時間計算量は O(N log N)(Nは文字数の合計)となり、単純な2重ループによる O(N²) のアプローチより大幅に高速です。なお、順序を気にせずさらに高速化したい場合は unordered_map を使うことで平均 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 解決アプローチ この問題を解くには、平行四辺形の面積を求める幾何学の公式を使用します。 面積 = 底辺 × 高さ つまり、与えられた底辺と高さを掛け合わせ