部分文字列の一致を検出
2つの文字列がありstring1とstring2とします。
やりたいことは、string1の中のある部分文字列がstring2の部分文字列と一致する場合、真を返す関数を作りたいのです。関数プロトタイプのイメージはこんな感じです。
bool CheckPartialMatch(char* string1, char* string2, int minChars);
[機能]
string1とstring2の部分文字列(minChars文字数以上)の一致の有無を調査する。
大文字と小文字の区別はしない。
[パラメータ]
string1:比較元のNULL終端文字列
string2:比較先のNULL終端文字
minChars:最小一致文字数
例として下記のようなケースを考えます。
string1="BananaAppleOrange"
string2="LemonPineappleKiwi"
minChars=4の場合、上記例では"appl"の4文字が一致しますのでtrueが返ることになります。
上記例では、minChars<=5ならtrue, minChars>=6ならfalseとなります。
部分一致が1か所でも見つかれば、その時点で以降の調査を打ち切ります。
何か所一致したとか、一致した位置といった情報は返しません。(位置情報は追加コストなしで返せるでしょうが、今回は必要ありません)
もちろん、ベタにstring1の1文字目から順に逐一string2と比較すれば実現できるのですが、それでは時間がかかります。
実際には、この処理をあるフォルダ内の全ファイル名に対して行いたいと思っています。
例えばファイル数が100とすると、組み合わせの数は100*(100-1)/2で4950となります。
仮に1ペアのチェックの所要時間が10msとしても、トータルで約50秒かかることになります。
1000ファイルともなると優に1時間を超える所要時間となり、現実的ではありません。
メモリを食い尽くすような処理ではないので放っておけば終わるのでしょうが、本当は数千のファイルに対してこの処理を行いたいと思っています。
以上を高速に処理する手段やアルゴリズムはないでしょうか?
boostなど外部のライブラリを使用した方が早いのであれば、それをご提案頂いても構いません。
実際の使用環境ではminCharsが4程度、比較文字列は平均して20文字程度(2バイト文字含む)を想定しています。
処理時間を低減するため、対象文字を英数字('A-Z'、'a-z'、'0-9')のみに限定することもオプションとして考慮したいと思っています。ファイル名ですので、実際には文字列内に2バイト文字や記号類も混じっています。
あらかじめ全ての入力文字列に対して英字を小文字に変換しておくとか、英数字以外の文字を(連続する場合はまとめて)代替文字("@"等)に置換しておけば少しは負荷軽減になるかとは思いますが、効果のほどは不明です。
お礼
痛っ
補足
みなさまありがとうございました。