C++で文字列に部分文字列が含まれているか確認する方法|find()関数の使い方を解説
ここでは、C++の標準文字列ライブラリ(std::string)を使って、メイン文字列の中に特定の部分文字列(サブストリング)が含まれているかどうかを確認する方法を解説します。検索には find() 関数を使用します。find() は、部分文字列が最初に出現する位置を返すため、この関数を繰り返し呼び出せば、メイン文字列内のすべての出現箇所を取得することができます。
部分文字列が見つかった場合、find() はその位置(インデックス)を返します。一方、見つからなかった場合は特別な定数 string::npos を返します。
したがって、「部分文字列がメイン文字列に存在するかどうか」を判定したい場合は、find() の戻り値が string::npos と等しいかどうかをチェックすればよいことになります。
以下は、部分文字列が出現する位置をすべて求める例です。
入力:メイン文字列 "aabbabababbbaabb"、部分文字列 "abb" 出力:部分文字列が見つかった位置 → [1, 8, 13]
アルゴリズム
String_Find(main_str, sub_str)
入力: メイン文字列と、検索対象となる部分文字列
出力: メイン文字列内における部分文字列の出現位置の一覧
pos := 0 while index = first occurrence of sub_str into the str in range pos to end of the string, do print the index as there is a match pos := index + 1 done
処理の流れとしては、まず検索開始位置 pos を 0 に初期化し、pos 以降の範囲で部分文字列を検索します。一致が見つかればその位置を出力し、検索開始位置を見つかった位置の次へ進めて再び検索を行います。これを文字列の末尾まで繰り返します。
サンプルコード
#include <iostream>
using namespace std;
int main() {
string str1 = "aabbabababbbaabb";
string str2 = "abb";
int pos = 0;
int index;
while ((index = str1.find(str2, pos)) != string::npos) {
cout << "Match found at position: " << index << endl;
pos = index + 1; // 見つかった位置の次の要素から検索を再開
}
return 0;
}実行結果
Match found at position: 1 Match found at position: 8 Match found at position: 13
補足:単純に「含まれるかどうか」だけを判定したい場合
出現位置をすべて求めなくても、単に部分文字列が含まれているかどうかだけを知りたい場合は、find() の戻り値を一度比較するだけで十分です。
if (str1.find(str2) != string::npos) {
cout << "Found" << endl; // 含まれている
} else {
cout << "Not found" << endl; // 含まれていない
}また、C++23以降では、より直感的に記述できる contains() メンバ関数が追加されています。str1.contains(str2) と書くだけで、含まれていれば true、いなければ false が返されます。新しいコンパイラを使用できる環境であれば、こちらの方が簡潔で読みやすいコードになります。
-
Swiftで文字列が別の文字列を含んでいるか確認する方法
Swiftである文字列に別の文字列が含まれているかどうかを確認するには、2つの異なる文字列が必要です。1つは検索対象となる文字列、もう1つはその中に特定の文字列が含まれているかを調べる元となる文字列です。 ここでは、確認したい文字列を「point」、全体の文字列を「TutorialsPoint」、そして別の文字列として「one two three」を使用して説明します。Playgroundでこれらの文字列を使って実際に確認してみましょう。 この確認は、以下に示す2つの方法で行うことができます。まずは3つの異なる文字列を作成します。 var completeStr1 = Tutorials po
-
Pythonで文字列に偶数長の回文(パリンドローム)部分文字列が含まれるかどうかを判定する方法
文字列 s が与えられたとき、その文字列の中に偶数の長さを持つ回文(パリンドローム)が含まれているかどうかを判定する問題を考えてみましょう。例えば、入力が s = afternoon の場合、出力は True になります。これは「afternoon」という文字列の中に、偶数長の回文である「noon」が含まれているためです。解き方のポイントこの問題には重要な性質があります。それは、偶数長の回文は必ず中央に「同じ文字が隣り合うペア」を持つという点です。例えば「noon」の場合、中央の2文字は「oo」であり、同じ文字が連続しています。つまり、文字列内を先頭から順に走査し、隣接する2文字が一致している