C++で文字列が2種類の文字の交互並びで構成されているかどうかを確認する方法
この記事では、文字列が2種類の文字が交互に並んで構成されているかどうかを判定する方法を解説します。例えば「XYXYXY」のように文字が交互に現れる文字列は有効ですが、「ABCD」のように異なる文字が連続して現れる文字列は無効とみなされます。
判定の考え方
判定方法は非常にシンプルです。すべての i 番目の文字と i+2 番目の文字が一致しているかどうかを順番に確認します。1つでも一致しない箇所があれば false を返し、すべて一致していれば true を返します。さらに、隣接する2文字(0番目と1番目)が同じ場合も無効と判定することで、「XXYY」のような並びを正しく除外できます。
サンプルコード
#include <iostream>
using namespace std;
bool hasAlternateChars(string str){
for (int i = 0; i < str.length() - 2; i++) {
if (str[i] != str[i + 2]) {
return false;
}
}
if (str[0] == str[1])
return false;
return true;
}
int main() {
string str = "XYXYXYX";
if(hasAlternateChars(str)){
cout << "Valid String";
}else{
cout << "Not a Valid String";
}
}出力結果
Valid String
コードの解説
このプログラムでは、まずループ内で各文字とその2つ隣の文字を比較しています。交互の文字列であれば、偶数番目同士・奇数番目同士は必ず同じ文字になるため、この比較だけで交互性を検証できます。ループを抜けた後、先頭の2文字が異なることも確認することで、隣接する文字の重複を防いでいます。すべての条件を満たした場合にのみ、その文字列は有効と判定されます。
なお、実用上は文字列の長さが2未満の場合の境界チェックを追加すると、より安全で堅牢な実装になります。このアルゴリズムの計算量は O(n) で、文字列を一度走査するだけで判定が完了するため、非常に効率的です。
-
特定の文字列からN文字のシーケンスを生成するC++プログラム
この記事では、指定された元の文字列(ベース文字列)をもとに、同じ文字を重複させずに長さNのシーケンス(文字列)を複数個生成するC++プログラムを紹介します。標準ライブラリの rand() 関数でランダムなインデックスを選択することで、実行のたびに異なる組み合わせのシーケンスを作り出せます。 アルゴリズム 開始 関数 GenerateSequence():特定のケースに対してN文字のシーケンスを生成する rand() を使ってランダムなインデックスを生成する 最初の文字はそのままシーケンスに格納する 2文字目以降は、すでに使用済みの文字な
-
C++で文字列に部分文字列が含まれているか確認する方法|find()関数の使い方を解説
ここでは、C++の標準文字列ライブラリ(std::string)を使って、メイン文字列の中に特定の部分文字列(サブストリング)が含まれているかどうかを確認する方法を解説します。検索には find() 関数を使用します。find() は、部分文字列が最初に出現する位置を返すため、この関数を繰り返し呼び出せば、メイン文字列内のすべての出現箇所を取得することができます。部分文字列が見つかった場合、find() はその位置(インデックス)を返します。一方、見つからなかった場合は特別な定数 string::npos を返します。したがって、「部分文字列がメイン文字列に存在するかどうか」を判定したい場合は