AcWing-899. Editar distância
descrição do tópico
Dadas n strings cujo comprimento não exceda 10 e m consultas, cada consulta fornece uma string e um limite superior para o número de operações.
Para cada consulta, descubra quantas das n strings fornecidas podem ser manipuladas na string fornecida pela consulta dentro do limite superior de operações.
Cada inserção, exclusão ou substituição de um único caractere em uma string conta como uma operação.
Formato de entrada
A primeira linha contém dois inteiros n e m.
As próximas n linhas contêm, cada uma, uma string representando a string fornecida.
Nas próximas m linhas, cada linha contém uma string e um inteiro, representando uma consulta.
A string contém apenas letras minúsculas e o comprimento da string não excede 10.
Formato de saída
Gera um total de m linhas e cada linha gera um número inteiro como resultado, indicando o número de sequências de caracteres que atendem às condições de uma consulta.
intervalo de dados
1≤n,m≤1000
Exemplo de entrada:
3 2
abc
acd
bcd
ab 1
acbd 2
Exemplo de saída:
1
3
linha de raciocínio
Representação do estado: f ( i , j ), que significa que a string A ( i ) é convertida em string B ( j ) Todos os operandos representação do estado: f(i,j), que significa que a string A (i) é convertida em string Todos os operandos de B(j)Representação do estado : f ( i ,j ) ,Indica todos os operandos da string A ( i ) convertidos na string B ( j ) _
Atributo: M em Atributo: MínimoAtributo : M i n
Core: A última operação é adição, exclusão ou modificação. Array A e array B são iguais. Core: A última operação é adição, exclusão ou modificação. Array A e array B são iguaisNúcleo : a última operação é adicionar , excluir ou alterar a matriz A e a matriz B são as mesmas
Divisão de estado: f ( i , j ) é obtida adicionando, excluindo ou modificando o estado anterior. Divisão de estado: f(i, j) é obtida adicionando, excluindo ou modificando o estado anteriorDivisão de estado : f ( i ,j ) obtido adicionando , excluindo ou modificando o estado anterior _
1. Obtido por adição, ou seja, a string A tem correspondência biunívoca com o primeiro j − 1 da string B: f ( i , j ) = f ( i , j − 1 ) + 1 1. Obtido por adição , ou seja, caracteres String A tem uma correspondência de um para um com o primeiro j-1 da string B: f(i,j) = f(i,j-1)+11. Obtido pela adição de , ou seja, a string A foi combinada com o primeiro j da string B−1 correspondência biunívoca : f ( i ,j )=f ( eu ,j−1 )+1
2. Obtido por deleção, ou seja, os primeiros i − 1 caracteres da string A têm correspondência de um para um com a string B: f ( i , j ) = f ( i − 1 , j ) + 1 2. Obtido por deleção, ou seja, caracteres O primeiro i-1 da string A tem correspondência de um para um com a string B: f(i,j) = f(i-1,j)+12. Obtido por deleção , ou seja, o primeiro i da string A−1 tem uma correspondência de um para um com a string B : f ( i ,j )=f ( eu−1 ,j )+1
3. Obtido por modificação, ou seja, os primeiros i − 1 caracteres da string A têm correspondência de um para um com os primeiros j − 1 caracteres da string A: 3. Obtido por modificação, ou seja, o primeiro i-1 os caracteres da string A foram combinados com a string A primeira correspondência um-para-um j-1:3. Obtido modificando , _ _Ou seja, o primeiro i da string A−1 foi vinculado ao primeiro j da string−1 correspondência um a um :
( 1 ) Se o i-ésimo da string A é igual ao j-ésimo da string: f ( i , j ) = f ( i − 1 , j − 1 ) (1) Se o i-ésimo do string A é igual à string The jth: f(i,j) = f(i-1,j-1)( 1 ) Se o i - ésimo da string A é igual ao j- ésimo da string:f ( eu ,j )=f ( eu−1 ,j−1 )
( 2 ) Se o i-ésimo da string A não for igual ao j-ésimo da string: f ( i , j ) = f ( i − 1 , j − 1 ) + 1 (2) Se o i- º da string A Diferente do j-ésimo da string: f(i,j) = f(i-1,j-1)+1( 2 ) Se o i - ésimo da string A não for igual ao j - ésimo da string:f ( eu ,j )=f ( eu−1 ,j−1 )+1
Encontre o valor mínimo para todos os estados acima
Como existem n strings cujo comprimento não excede 10 e m consultas, para cada consulta, o valor mínimo de n strings de conversão é menor que o limite fornecido, adicione 1 a ans e imprima ans no final de cada consulta, o que é Resposta.
código principal
for(int i=1;i<=n;i++) {
for(int j=1;j<=m;j++) {
dp[i][j] = Math.min(dp[i-1][j]+1, dp[i][j-1]+1);
dp[i][j] = Math.min(dp[i][j], dp[i-1][j-1]+(A[i]==B[j]?0:1));
}
}
código completo
package acWing899;
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class Main {
static int N = 1010,M=15;
static char A[][] = new char[N][M];
public static void main(String[] args) throws Exception{
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
String str[] = bf.readLine().split(" ");
int n = Integer.parseInt(str[0]);
int m = Integer.parseInt(str[1]);
for(int i=1;i<=n;i++) {
A[i] = ("0"+bf.readLine()).toCharArray();
}
for(int i=1;i<=m;i++) {
str = bf.readLine().split(" ");
char B[] = ("0"+str[0]).toCharArray();
int count = Integer.parseInt(str[1]);
int ans = 0;
for(int j=1;j<=n;j++) {
if(edit_distance(A[j],B)<=count) {
ans++;
}
}
System.out.println(ans);
}
}
public static int edit_distance(char A[],char B[]) {
int n = A.length-1;
int m = B.length-1;
int dp[][]= new int[N][N];
for(int i=0;i<=m;i++) {
dp[0][i] = i; // A(0)变为B(i),需要i步增加操作
}
for(int i=0;i<=n;i++) {
dp[i][0] = i; // A(i)变为B(0),需要i步删除操作
}
for(int i=1;i<=n;i++) {
for(int j=1;j<=m;j++) {
dp[i][j] = Math.min(dp[i-1][j]+1, dp[i][j-1]+1);
dp[i][j] = Math.min(dp[i][j], dp[i-1][j-1]+(A[i]==B[j]?0:1));
}
}
return dp[n][m];
}
}