Dado un objetivo de cadena de longitud m y una cadena de longitud n, pregunte si puede encontrar una subcadena continua de longitud m en str, de modo que esta subcadena consta de m cadenas de objetivo. El orden no importa, devuelva la posición inicial. de cualquier subcadena que cumpla la condición, y devuelve -1 si no se encuentra
/* 思路:
创建一个数组count用于统计aim中的字符串出现的频率,
利用滑动窗口在str上从左到右滑动,直到窗口走完整个str或者发现发现匹配的子串 (result==0)表示匹配成功
时间复杂度:O(n+m)
*/
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int isUnorderedMatch(string& str, string& aim) {
if (str.empty() || aim.empty() || str.length() < aim.length()) {
return -1;
}
vector<int> count(128, 0);
for (char ch : aim) {
count.at(ch)++;
}
int i = 0;
int result = 0;
for (; i < aim.length(); i++) {
if (count.at(str.at(i))-- == 0) {
result++;
}
}
for (; i < str.length(); i++) {
if (result == 0) {
return i - aim.length();
}
if (count.at(str.at(i))-- <= 0) {
result++;
}
if (count.at(str.at(i - aim.length()))++ < 0) {
result--;
}
}
return result == 0 ? (i - aim.length()) : -1;
}
int main() {
string str("akaafcbaabc");
string aim("aabc");
cout << isUnorderedMatch(str, aim) << endl;
system("pause");
return 0;
}
Si hay alguna infracción, comuníquese para eliminarla. Si hay un error, corríjame, gracias