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 :
¿Alguien me puede ayudar?
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;
}
}
Valora esta pregunta
0