我正在尝试找到一种最佳方法来查找字符串模式并进行比较。例如,我有 s1 =“红蓝蓝红红黄”和 s2 =“ abbaac ”。这将匹配,因为它们具有相同的模式。
我这样做的想法是遍历 s1 和 s2,使用向量容器记录相应位置的计数(对于 s1 将是相应的单词数,对于 s2 将是相应的字母数),然后进行比较。
这确实效率低下,因为我遍历整个 s1 和 s2。如果 s1 = “红蓝红红红黄”和 s2 = “ abbaac ”。在第三个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;
}