Coincidencia de cadenas (enviado para una nueva prueba en la máquina)

Prefacio:

21. Independientemente de si puede ingresar a la nueva prueba o no, registre el código de basura escrito en el camino. Originalmente mordí "Notas de algoritmo", pero sentí demasiado para hacerlo, así que lo cambié a una guía de prueba manual.

Descripción del Título:

Encontrar todas las ocurrencias de un patrón en un texto es un problema que surge con frecuencia en los programas de edición de texto. Normalmente, el texto es un documento que se está editando y el patrón buscado es una palabra particular proporcionada por el usuario. Suponemos que el texto es una matriz T [1… n] de longitud n y que el patrón es una matriz P [1… m] de longitud m <= n. Además, asumimos que los elementos de P y T son todos alfabetos (∑ = {a, b…, z}) Las matrices de caracteres P y T a menudo se denominan cadenas de caracteres. Decimos que el patrón P ocurre con desplazamiento s en el texto T si 0 <= s <= n y T [s + 1… s + m] = P [1… m] (es decir, si T [s + j] = P [j], para 1 <= j <= m). Si P ocurre con un desplazamiento s en T, entonces lo llamamos un desplazamiento válido; de lo contrario, llamamos un desplazamiento inválido. Su tarea es calcular el número de turnos vald para el texto dado T y el patrón P.

Ingrese descripción

Para cada caso, hay dos cadenas T y P en una línea, separadas por un solo espacio. Puede asumir que tanto la longitud de T como la P no excederán 10 ^ 6.

Descripción de salida:

Debe generar un número en una línea separada, que indica el número de turnos válidos para el texto dado T y el patrón P.

responder

#include<iostream>
#include<string>
#include<vector>
using namespace std;

const int MAXN = 1000 + 10;

void getnext(int next[], string t) {
    
    
	int k = -1, j = 0;
	next[0] = -1;
	while (j < t.length() -1 )
		if (k == -1 || t[k] == t[j])
			next[++j] = ++k;
		else
			k = next[k];
	return;
}

int KMP(string text,string t,int next[]) {
    
    
	int i = 0, j = 0;
	int count = 0;
	while (i < (int)(text.length()) && j < (int)(t.length())) {
    
    	
	//注意一定要加强制类型转换,length()返回的是无符号数,若不加当j=-1,比较的时候j被转为无符号数,会变得很大,导致bug
		if (j == -1 || text[i] == t[j]) {
    
    
			i++;
			j++;
		}
		else
			j = next[j];
		if (j == t.length()) {
    
    
			i = i - j + 1;
			j = 0;
			count++;
		}
	}
	return count;
}

int main() {
    
    
	string text, pattern;
	while (cin >> text >> pattern) {
    
    
		int next[MAXN];
		getnext(next, pattern);
		cout << KMP(text, pattern, next) << endl;
	}
	return 0;
}

Es muy conveniente usar find () de STL, pero acabo de terminar de aprender el algoritmo KMP hoy y todavía quiero implementarlo manualmente. La longitud () de la cadena devuelve un número sin firmar. Esto es realmente ridículo. Después de pensar en ello durante mucho tiempo, no lo entiendo.

Supongo que te gusta

Origin blog.csdn.net/weixin_44897291/article/details/112966064
Recomendado
Clasificación