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

C++で配列内に1文字だけ異なる文字列が存在するかどうかを確認する方法

文字列 s と、複数の文字列を格納した配列 A があるとします。このとき、配列の中に「元の文字列と長さが同じで、かつ1文字だけ異なる文字列」が存在するかどうかを判定する問題を考えてみましょう。

例えば、文字列が "banana" で、配列が ["bana", "orange", "banaba", "banapy"] の場合を想定します。このうち "banaba""banana" と長さが同じで、1文字だけ異なるため、結果は true となります。

解決のアプローチ

この問題は、以下の手順で解くことができます。

  • 配列内の各文字列に対して、次の処理を繰り返します。
  • まず、その文字列の長さが s と同じかどうかを確認します。長さが異なる場合はスキップします。
  • 長さが同じ場合は、各文字を順に比較し、不一致がちょうど1箇所だけあるかどうかをチェックします。
  • 1箇所だけの不一致が見つかれば true を返し、見つからなければ最終的に false を返します。

C++での実装例

#include<iostream>
#include<vector>
using namespace std;
bool hasOneCharMismatch(vector<string>arr, string s) {
    int n = arr.size();
    if (n == 0)
        return false;
    for (int i = 0; i < n; i++) {
        if (arr[i].size() != s.size())
            continue;
        bool difference = false;
        for (int j = 0; j < (int)arr[i].size(); j++) {
            if (arr[i][j] != s[j]) {
                if (!difference)
                    difference = true;
                else {
                    difference = false;
                    break;
                }
            }
        }
        if (difference)
            return true;
    }
    return false;
}
int main() {
    vector<string> arr;
    arr.push_back("bana");
    arr.push_back("orange");
    arr.push_back("banaba");
    arr.push_back("banapy");
    if(hasOneCharMismatch(arr, "banana")){
        cout << "One character mismatch found";
    }
    else{
        cout << "One character mismatch not found";
    }
}

実行結果

One character mismatch found

コードのポイント

このアルゴリズムでは、変数 difference をフラグとして使用しています。最初に不一致文字が見つかった時点でフラグを立て、2つ目の不一致が見つかった時点で即座にループを抜けて次の文字列へ進みます。これにより、無駄な比較を避け、効率的に判定を行うことができます。

計算量は、配列の要素数を n、文字列の長さを m とすると、最悪の場合 O(n × m) となります。長さが異なる文字列は早期にスキップされるため、実際の処理はより高速に動作するケースが多いです。

  1. C++で文字列に部分文字列が含まれているか確認する方法|find()関数の使い方を解説

    ここでは、C++の標準文字列ライブラリ(std::string)を使って、メイン文字列の中に特定の部分文字列(サブストリング)が含まれているかどうかを確認する方法を解説します。検索には find() 関数を使用します。find() は、部分文字列が最初に出現する位置を返すため、この関数を繰り返し呼び出せば、メイン文字列内のすべての出現箇所を取得することができます。部分文字列が見つかった場合、find() はその位置(インデックス)を返します。一方、見つからなかった場合は特別な定数 string::npos を返します。したがって、「部分文字列がメイン文字列に存在するかどうか」を判定したい場合は

  2. 【C++入門】通常の配列を任意のデフォルト値で初期化する方法

    配列全体を0で初期化する最も簡単な方法C++では、配列全体を0で初期化するのは非常に簡単です。宣言時に以下のように {0} を指定するだけで、すべての要素が0になります。int arr[10] = {0};0以外の値ではうまくいかない理由しかし、同じ方法で配列全体を0以外の値で初期化することはできません。次のようなコードを書いても、意図した結果にはなりません。int arr[10] = {5};この場合、最初の要素だけが5で初期化され、残りの9個の要素はすべて0で初期化されます。これは、初期化リストで明示的に値を指定しなかった要素には自動的に0が代入されるというC++の仕様によるものです。fo