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

,

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

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.

1 curtida

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;
}
2 curtidas

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");
	    }
  }

}

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”
?

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());
2 curtidas

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

1 curtida