Java - Ayuda con un programa que genere todas las palabras posibles a partir de las letras de una palabra

   
Vista:

Ayuda con un programa que genere todas las palabras posibles a partir de las letras de una palabra

Publicado por Carlos (2 intervenciones) el 10/10/2013 20:28:18
Bueno pues el programa consiste en esto : Escribir un programa que genere todas las palabras (con significado o no) posibles a partir de las letras de una palabra dada por la entrada estándar. La palabra puede tener letras repetidas y no se debe generar la misma palabra más de una vez. Las palabras deberán ser imprimidas en la salida estándar en orden alfabético ascendente. No se distingue entre mayúsculas y minúsculas pero no se deben perder las letras mayúsculas porque en el orden en el que se deben dar los anagramas generados la letra mayúscula va antes en el orden alfabético que su correspondiente letra minúscula. Así se deberán mantener las letras mayúsculas existentes en la entrada para generar en el orden adecuado la salida.

Entrada

La entrada consistirá en varias palabras. La primera línea contendrá un número entero positivo indicando el número de palabras que siguen. A continuación vendrá una palabra por línea. Una palabra podrá contener letras mayúsculas y minúsculas sin acentuar.

Salida

Por cada palabra de entrada se imprimirán las palabras distintas que se pueden formar, una por línea, y en orden alfabético ascendente.

Ejemplo

Entrada

1

abc

Salida

abc

acb

bac

bca

cab

cba



He conseguido desarrollar el programa pero esque resulta que tengo un problema con las palabras repetidas por ejemplo si meto "aaa" sale 6 veces y debería salir una vez y lo mismo pasa con palabras que tienen letras repetidas que se generan palabras repetidas y no soy capaz de solucionarlo, el código que tengo es este :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
public class Anagramas
{
	private String[] vector;
	public Anagramas (String vector[]){
		this.vector=vector;
	}
	public static String[]  permutar(String cadena,int p)
	{
		String[] per=new String[p];
		int l = cadena.length();
		int d=p/l;
		// Array de string el cual llama al metodo permutacion que le pasa como parametro cadena
		String[] aux = permutacion(cadena);
		// Inicializo la variable pos
		int pos =0;
		if(p==1|l==1)
		{
			per[0] = cadena;
			return per;
		}
  //Recorro el array aux 
		for(int i=0;i<aux.length;i++)
		{
			String[] auxiliar = permutar(aux[i].substring(1),factorial(l-1));
			for(int j=0;j<auxiliar.length;j++)
			{
				per[pos]=aux[i].charAt(0)+auxiliar[j];
				pos++;
			}
		}
		return per;
 
	}
	public static String[] permutacion(String cadena)
	{
		//Declaro una variable n la cual se le asigna el tamaño del String "cadena"
		int n = cadena.length();
		//Variable temporal inicializada
		String temporal="";
		// Array de String llamado vector que tiene como tamaño "n" el cual es el tamaño de la cadena
		String[] vector = new String[n];
		// Asigno a la posicion del vector 0 la cadena
		vector[0]=cadena;
		// For anidado el cual empieza en 1 ya que en la posicion 0 esta la cadena
		for(int i=1;i<n;i++)
		{
 
			for(int j=0;j<n;j++)
			{
				// Si j es igual a n-1 cojo la variable temporal y le sumo el caracter que hay en la posicion j
				if(j==n-1)
						temporal = cadena.charAt(j)+temporal;
				else temporal += cadena.charAt(j);
			}
			// Intercambio de variables
			cadena=temporal;
			vector[i]=temporal;
			temporal="";
		}
		return vector;
	}
	//Metodo para mostrar por pantalla
		public static void mostrar (String[] vector)
		{
 
			for(int i=0; i< vector.length;i++)
			{
				System.out.println(vector[i]);
			}
 
		}
 
 
	//Ordena las palabras en orden ascendente teniendo en cuenta las mayusculas y minusculas
	public void ordenar(){
		for(int i=0; i<vector.length;i++){
			for(int j=0; j<vector.length&&i!=j; j++){
				if(vector[i].compareTo(vector[j])<0){
					String aux=vector[i];
					vector[i]=vector[j];
					vector[j]=aux;
				}
			}
		}
	}
	//Metodo Main
	public static void main ( String args [])
	{
		Scanner pa= new Scanner(System.in);
		int num= pa.nextInt();
		String[] cad = new String[num];
			for(int i=0; i<cad.length; i++){
				String p =pa.next();
   // Creo un entero llamado pr el cual llama al metodo factorial y le pasa como parametro el tamaño del String p
		int pr = factorial(p.length());
		//Array de String que permuta la palabra p 
		String[] ne = permutar(p,pr);
		//Creo un objeto de la clase Anagramas llamado e para llamar a los metodos ordenar y mostrar 
		Anagramas e = new Anagramas (ne);
		e.ordenar();
		e.pertenece(p, ne);
		mostrar(ne);
		}
 
	}
	//Metodo para hacer el factorial
	public static int factorial (int n)
	{		int resultado;
		if(n==1||n==0)
			return 1;
		resultado = factorial(n-1)*n;
		return resultado;
	}
 
}
¿Alguien me puede ayudar?
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Jhonnathan Emilio Cardona Saineda

Ayuda con un programa que genere todas las palabras posibles a partir de las letras de una palabra

Publicado por Jhonnathan Emilio Cardona Saineda (328 intervenciones) el 18/10/2013 19:23:47
Hola, te dejo algo que busque por internet como "algoritmo de permutación". Lo saque de:
http://ramonberrutti.com/index.php/2011/02/algoritmo-de-permutaciones/. La verdad traté de hacerlo pero me estaba demorando mas de lo normal. lo busqué y nunca lo hubiera imaginado así:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
String palabra="abc";
			String salida="";
			int opciones=1;
			for (int i = 1; i <=palabra.length(); i++) {
				opciones*=i;
			}
			System.out.println("Numero de permutaciones:"+opciones);
			char palabras[]=palabra.toCharArray();
			for (int i = 0; i < opciones; i++) {
				System.out.println(palabras);
				char t=palabras[i%(palabras.length-1)];
				palabras[i%(palabras.length-1)]=palabras[palabras.length-1];
				palabras[palabras.length-1]=t;
			}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ayuda con un programa que genere todas las palabras posibles a partir de las letras de una palabra

Publicado por gino (1 intervención) el 27/05/2015 07:51:58
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
//aca uno recursivo :D
public class Main{
 
	static int count=0;
    public static void combinaciones(String primero,String cadena) {
 
    	if(cadena.length()==2)
    	{
    		count=count+2;
    		System.out.println(primero+cadena.charAt(1)+""+cadena.charAt(0));
    		System.out.println(primero+cadena.charAt(0)+""+cadena.charAt(1));
    	}
    	else{
    		for (int i=0;i<cadena.length();i++) {
    		   		combinaciones(primero+cadena.charAt(i),quitarLetra(cadena,i));
    		}
    	}
    }
    public static String quitarLetra(String cadena,int i)
    {
    	if(i==0)
    	{
    		return cadena.substring(i+1,cadena.length());
    	}
    	else
    	{
    		if(i==cadena.length())
    		{
    			return cadena.substring(0,cadena.length()-1);
    		}
    		else
    		{
    			return cadena.substring(0,i)+cadena.substring(i+1,cadena.length());
    		}
    	}
    }
    public static void main(String args[]) {
    	String cadena="abcde";
    	System.out.println("combinaciones de :"+cadena);
    	combinaciones("",cadena);
    	System.out.println("total:"+count);
    }
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ayuda con un programa que genere todas las palabras posibles a partir de las letras de una palabra

Publicado por Aczr Raentzn ars.structoria@live.com (1 intervención) el 10/12/2015 09:31:14
Disculpa, podrías enviarme tu software terminado, sucede que me es muy importante, no soy programador pero me gustaría poder utilizarlo para hacer un trabajo. Muchas gracias y buen día!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar