AcWing-899. Editar distância (implementação java)

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 B1 correspondência biunívoca : f ( i ,j )=f ( eu ,j1 )+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 A1 tem uma correspondência de um para um com a string B : f ( i ,j )=f ( eu1 ,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 A1 foi vinculado ao primeiro j da string1 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 ( eu1 ,j1 )

( 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 ( eu1 ,j1 )+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];
	}
}

おすすめ

転載: blog.csdn.net/gudada010/article/details/117534670
おすすめ