Desafio de programação

Recentemente recebi um desafio que não consigo resolver. Texto do desafio:

“Aconteceu algum problema em nosso servidor e algumas palavras do banco de dados ficaram
com o final duplicado.
Sua tarefa é remover duplicação do fim de cada palavra de um texto, mas somente se todas as
palavras do texto tiverem duplicação.
Envie sua solução em um único arquivo mesmo, nessa etapa vamos avaliar o funcionamento
correto do seu algoritmo”

Exemplo de entrada: “oo ratoato roeuoeu aa roupaoupa dodo reiei
dee romaoma”

Como deve ser a saída: “o rato roeu a roupa do rei de roma”

O que consegui condificar:
import java.util.ArrayList;
import java.util.List;

public class Main {

    public static void main(String[] args) {

        String entrada = "oo ratoato roeuoeu aa roupaoupa dodo reiei dede romaoma";
        String [] palavras = entrada.split("");
        List<String> resposta = new ArrayList<>();
   
        for(int i = 0, j = 1; i < palavras.length; i++, j ++) {
            resposta.add(palavras[i]);
            if(palavras[i].contains(" ")) {

                if (palavras[i] != " ") {

                    palavras[i - 1].replace(palavras[i - 1], "");

                }
            }
        }

        System.out.println(resposta);
    }
}

Resposta que estou obtendo:
[o, o, , r, a, t, o, a, t, o, , r, o, e, u, o, e, u, , a, a, , r, o, u, p, a, o, u, p, a, , d, o, d, o, , r, e, i, e, i, , d, e, d, e, , r, o, m, a, o, m, a]

Eu não estou conseguindo verificar se as letras estão repetidas dentro de cada cadeia de caracter passada depois e antes de cada espaço vazio. Alguém consegue me ajudar, por favor?

1 curtida

Bom dia.

Se todas as palavras seguirem o padrão do exemplo, então eu faria da seguinte forma:

  1. Separar as palavras a cada espaço

  2. Testar as palavras
    a) Se possuírem só 2 letras, copiar a 1ª e ignorar a 2ª
    b) Se possuírem mais de 2 letras:

i. Contar quantos caracteres têm cada palavra
ii. Reduzir 1 caractere do total (já que ele tem duplicado o resto, a partir da segunda letra)
iii. Dividir o total por 2 (já que o resto é duplicado igual)
iv. Copiar, de cada palavra, o 1º caractere até a posição “(total / 2) +1”
v. Adicionar a palavra acima numa string + " " (espaço em branco) ou num List

Muito obrigado Fefo80 sua ajuda contribuiu muito para dar um norte ao projeto.

1 curtida

Opa HelintonAlves, fiz um projetinho com a solução do seu problema, confere lá no https://github.com/DonShell/limpar-texto-repetido.

Consistiu em ler cada palavra de tras pra frente, comparando com o texto mais proximo (a esquerda) e do mesmo tamanho, exemplo:
para apalavra rato “ratoato”
“t” == “o”
“oa” == “to”
“ato” == “ato” //parte repetida

Então bastou mapear onde começa a repetição e reoctaar a String antes dela.

public class tratamentoDeTexto {
	public static String limparRepeticaoDoFinal(String texto)
	{
		String novoTexto = texto;
		//garante que não será analisado nenhuma palavra de um caracter só
		if (texto.length() > 1 ) 
		{
			String sequencia = "";
			String pedacoDeAnalise = "";
			int inicioPedacoDeAnalise = 0; 
			for (int i = texto.length() - 1; i >= 0 ; i--) {
				sequencia = texto.charAt(i) + sequencia;
				
				// limita a busca de sequencia para não pegar substring invalida (que escede o texto)
				if (sequencia.length() <= (texto.length()/2))
				{
					inicioPedacoDeAnalise =  texto.length() - (sequencia.length() * 2) ;			
					pedacoDeAnalise = texto.substring( inicioPedacoDeAnalise, inicioPedacoDeAnalise + sequencia.length());
					if (sequencia.equals(pedacoDeAnalise))
					{
						novoTexto = texto.substring( 0, inicioPedacoDeAnalise + sequencia.length());
						//saindo do loop
						i = -1;
					}
				}
				else
				{
					i = -1;
				}
			}
		}
		
		return novoTexto;
	}
	public static String limparRepeticaoDoFinalDePalavras(String texto)
	{
		String textoLimpo = "";
		String palavras[] = texto.split(" ");
		String palavrasLimpas[] = new String[palavras.length];
		//tratando as palavras
		for (int i = 0; i < palavras.length; i++) 
		{
			palavrasLimpas[i] = limparRepeticaoDoFinal(palavras[i]);
			textoLimpo += " " + palavrasLimpas[i];
		}
		
		
		boolean TodasPalavrasTinhamRepeticoes = true;
		//verificando se todas as palavras estavam alteradas
		for (int i = 0; i < palavras.length; i++) 
		{	
			TodasPalavrasTinhamRepeticoes = palavras[i].equals(palavrasLimpas[i]) ? false : TodasPalavrasTinhamRepeticoes;
		}
		
		return  TodasPalavrasTinhamRepeticoes? textoLimpo : texto;
	}
	
	public static String[] LimparFrasesQuePossuemRepeticoesNoFinal(String frases[])
	{
		String frasesLimpas[] = new String[frases.length];
		
		for (int i = 0; i < frases.length; i++) {
			frasesLimpas[i] = limparRepeticaoDoFinalDePalavras(frases[i]);
		}
		
		return frasesLimpas;
	}
	
}

Espero ter ajudado. Forte abraço!