Implementación de coincidencia desordenada de cadenas

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

Supongo que te gusta

Origin blog.csdn.net/xiao_ma_nong_last/article/details/105672462
Recomendado
Clasificación