Verificar se uma string pode ser formada a partir de outra. ex.[abc] pode gerar [baaac]

6 respostas Resolvido
cjava
OkumuraMTV

Olá, estou com dificuldade para desenvolver um programa onde o usuário entra com uma quantidade de caracteres, e em seguida o usuário entra com uma palavra e o programa responde se a palavra digitada pode ou não ser gerada pelos caracteres digitados antes.
Estou tentando em java, mas pode ser em c++ tbm

6 Respostas

RoinujNosde

Armazene os caracteres numa lista ou Set.
Método que retorna booleano:
Itere pela palavra e vá checando se cada carácter da palavra está na lista, se algum não tiver, pode retornar false.
Ao final da iteração, retorne true.

wldomiciano
Solucao aceita

Seguindo a ideia de armazenar num Set, em Java, poderia ser assim:

import java.util.Scanner;
import java.util.Set;
import java.util.stream.Collectors;

public class Main {
  public static void main(String... args) {
    try (Scanner scan = new Scanner(System.in)) {
      Set<Integer> letters = scan.nextLine().chars().boxed().collect(Collectors.toSet());
      Set<Integer> word = scan.nextLine().chars().boxed().collect(Collectors.toSet());

      letters.retainAll(word);

      if (letters.equals(word))
        System.out.println("Pode ser gerada.");
      else
        System.out.println("Não pode ser gerada.");
    }
  }
}

Já em C++ poderia ser assim:

#include <algorithm>
#include <iostream>
#include <set>

int main() {
  std::string input;

  std::getline(std::cin, input);
  const std::set<char> letters(input.begin(), input.end());

  std::getline(std::cin, input);
  const std::set<char> word(input.begin(), input.end());

  std::set<char> intersection;

  std::set_intersection(letters.begin(), letters.end(), word.begin(), word.end(), std::inserter(intersection, intersection.begin()));

  if (word == intersection)
    std::cout << "Pode ser gerada." << '\n';
  else
    std::cout << "Não pode ser gerada." << '\n';

  return 0;
}
OkumuraMTV

pode me dar um exemplo?
Estou fazendo desse jeito, mas n ta dando certo, sou iniciante kk
import javax.swing.JOptionPane;

public class Principal {
public static void main(String[] args) {

String string;
	    String alfa;
	    boolean veri=false;
	    
	    alfa = JOptionPane.showInputDialog("Entre com o alfabeto:");
	    string = JOptionPane.showInputDialog("Entre com a palavra:");
	    

	    
	    if (string.compareTo(alfa)==0) {
	        
	    	veri=true;
	        
	    }else {
	    	
	    	JOptionPane.showMessageDialog(null,"Não pertence ao alfabeto");
	    }
	    
	    if (veri==true) {
	        	JOptionPane.showMessageDialog(null,"Pertence ao alfabeto");
	    }
  }

}

OkumuraMTV

botei aqui no java e no c++ e realmente deu certo, mas confesso q n entendi muito.
Em qual linha eu peço pro usuário digitar os valores? teria como eu implementar um texto tipo “Entre aqui com o alfabeto”
“Entre aqui com a palavra”
?

wldomiciano

Usando sua ideia com o JOptionPane, ficaria assim:

Set<Integer> letters = JOptionPane.showInputDialog("Entre com o alfabeto:")
                                  .chars()
                                  .boxed()
                                  .collect(Collectors.toSet());

Set<Integer> word = JOptionPane.showInputDialog("Entre com o alfabeto:")
                               .chars()
                               .boxed()
                               .collect(Collectors.toSet());
OkumuraMTV

Saquei, me achei mais um pouco, vou pesquisar mais sobre Set, parece ser bem util. valeeu

Criado 11 de abril de 2021
Ultima resposta 11 de abr. de 2021
Respostas 6
Participantes 3