1. Subsecuencia de ventana mínima de Leetcode 727 (dp registra la posición inicial y se calcula la longitud)
T S y la cadena dada, buscando en las subcadenas continuas mínimas W S tal que W T es la secuencia (orden) . Si no se encuentra, devuelve "". Si se encuentran varias subcadenas con la longitud más pequeña, devuelve la que tiene el índice izquierdo más pequeño.
https://blog.csdn.net/weixin_45588823/article/details/100642933
2. Subcadena de cobertura mínima de Leetcode 76
La diferencia con 727 es "dadas las cadenas de caracteres S y T, busque la subcadena continua más pequeña W en S para que W contenga todos los caracteres en T, es decir, puede estar fuera de orden ".
La idea es el puntero de cabeza y cola, la cola sigue caminando hacia atrás hasta que contiene completamente T, y luego comienza a caminar (mientras camina mientras se registra la subcadena más corta) hasta que no contiene completamente T, y luego continúa caminando con la cola , repitiendo (siguiendo) Un rato, incluido un rato)
https://blog.csdn.net/whdAlive/article/details/81132383
3. Leetcode 1139 El cuadrado más grande bordeado por 1
Pensé en la idea. Es similar al cuadrado anterior. Use [i] [j] como la esquina inferior derecha para registrar dos dp (el más largo va hacia la derecha y el más largo sube), y luego de estos dos Elija uno pequeño, enumere la longitud del lado de este cuadrado de grande a pequeño , determine si es factible y registre ans. (Quería grabar cuatro bordes, pero descubrí que solo dos bordes están relacionados con la esquina inferior derecha, y los bordes aún no están enumerados, por lo que es mejor registrar dos bordes)
class Solution {
public:
int largest1BorderedSquare(vector<vector<int>>& grid) {
if (grid.size()==0 || grid[0].size()==0) return 0;
int n=grid.size(),m=grid[0].size();
int ans=0;
//f[i][j][0]表示往左最长,f[i][j][1]表示往上最长
int f[n+10][m+10][2];
memset(f,0,sizeof(f));
for (int i=1;i<=n;i++)
for (int j=1;j<=m;j++)
if (grid[i-1][j-1]==1)
{
f[i][j][0]=f[i][j-1][0]+1;
f[i][j][1]=f[i-1][j][1]+1;
int maxlen=f[i][j][0];
if (f[i][j][1]<maxlen) maxlen=f[i][j][1];
for (int k=maxlen;k>ans;k--)
{
if (f[i][j-k+1][1]>=k && f[i-k+1][j][0]>=k)
{
ans=k;
break;
}
}
}
return ans*ans;
}
};
4.