¿Por qué es importante la condición i + j <n en el siguiente código?

Bueno, la condición i + j <n es importante y necesaria porque:

(1) Hace que el ciclo sea marginalmente más rápido.
Ejemplo: Dada una cadena de entrada de longitud 100 y una cadena de búsqueda de longitud 20. En lugar de verificar 100 elementos de la matriz para encontrar una cadena de 20 caracteres que no se encuentra en esa cadena, podemos hacer que la función devuelva falso, inmediatamente después de verificar 81 caracteres. Esto es más rápido que verificar los 100 elementos y luego devolver falso.

(2) Para que el código no tenga errores
En ciertos casos, las ubicaciones de memoria después de la matriz de entrada pueden ser utilizadas por otras matrices u otras variables. Pero en ciertos otros casos, esta matriz podría estar al final de la página de memoria disponible, por lo que acceder más allá de esa matriz podría ser un error de página.

Una mejor manera de escribir este código sería la siguiente, donde esencialmente he cambiado solo 2 líneas:

  para (i = 0; i + m <n; i ++) // cambio de código
 {
     para (j = 0; j <m; j ++) // cambio de código
         if (texto [i + j]! = patrón [j]) // comprueba la coincidencia en la posición i + j
             rotura ;  // no se encuentra la coincidencia, rompe el bucle interno
     if (j == m) devuelve verdadero;  // coincidencia encontrada
     de lo contrario devuelve falso;  // coincidencia encontrada
 }

En el código modificado, estoy verificando i + m <n, de modo que, comenzando en la posición i, y tomando m caracteres, el texto del elemento [i + j] en la línea 4 (donde j es menos que m) no va fuera de la matriz.

Si está buscando encontrar un patrón P de longitud m dentro de un texto T , ¿realmente necesita mirar los últimos m – 1 caracteres de T ? ¿Seguramente no vas a encontrar una cadena larga de m caracteres con menos de m caracteres restantes?

EDITAR: Como señala Prem Ranjan, la condición i + j , aunque implícitamente logra el mismo objetivo que mi respuesta anterior, se ha implementado explícitamente para evitar acceder a ubicaciones de memoria fuera de la matriz text [] . Ese es su uso real.

No lo necesita siempre que las cadenas sean cadenas C, terminadas en nulo. Pero de lo contrario, en serio, ¿por qué crees que es importante?

Edición posterior: la cadena terminada en nulo hará que la condición si (texto [i + j] …) se rompa cuando i + j llegue al final de la cadena. Sin embargo, el uso de la condición es bastante obvio. Y probablemente los parámetros son const char *

En serio, la condición i + j

considere la iteración:

n = 5 {el tamaño del texto es n}
m = 4 {el tamaño del patrón es m}

i = 3
j = 3

texto [i + j] ====> texto [3 + 3] =====> texto [6] X ERROR
{porque la sexta posición no está disponible}