文字列のパターンを見つけて比較する最適な方法を見つけようとしています。たとえば、s1 = "赤青青赤赤黄"、および s2 = " abbaac " があります。同じパターンなので一致します。
これを行う私の考えは、s1 と s2 を反復処理し、ベクトル コンテナーを使用して対応する場所のカウントを記録し (s1 は対応する単語のカウントになり、s2 は対応する文字のカウントになるため)、比較します。
これは、s1 と s2 全体を反復処理するため、非常に非効率的です。s1 = " red blue red red red red yellow " および s2 = " abbaac " の場合。3 番目のredの後、それを反復し続ける意味は本質的にありません。
それで、これを行う方法について何か良いアイデアはありますか?
コード:
#include "stdafx.h"
#include <iostream>
#include <string>
#include <array>
#include <sstream>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> findPattern(string pattern){
vector<int> counts;
for (int i = 0; i < pattern.size(); ++i){
counts.push_back(0);
int counter = 0;
for (int j = i + 1; j < pattern.size(); ++j){
if (pattern[i] == pattern[j]){
++counter;
}
counts[i] = counter;
}
}
return counts;
}
vector<int> findPatternLong(string pattern){
istringstream iss (pattern);
string word;
vector<string> v;
while (iss >> word){
v.push_back(word);
}
vector<int> counts2;
for (int i = 0; i < v.size(); ++i){
counts2.push_back(0);
int counter = 0;
for (int j = i + 1; j < v.size(); ++j){
if (v[i] == v[j]){
++counter;
}
counts2[i] = counter;
}
}
return counts2;
}
int main(int argc, char * argv[]){
vector<int> v1 = findPattern("abbaac");
vector<int> v2 = findPatternLong("red blue blue red red yellow");
if (v1.size() == v2.size()){
for (int i = 0; i < v1.size(); ++i){
if (v1[i] != v2[i]){
cout << "Unmatch" << endl;
return false;
}
}
cout << "match" << endl;
return true;
} else
cout << "Unmatch" << endl;
return 0;
}