Foros del Web » Programación para mayores de 30 ;) » .NET »

[SOLUCIONADO] Contar combinaciones de letras en un string c#

Estas en el tema de Contar combinaciones de letras en un string c# en el foro de .NET en Foros del Web. Hola !! estoy buscando ayuda porque necesito un algoritmo que me permita contar la cantidad de combinaciones de pares de letras de un string y ...
  #1 (permalink)  
Antiguo 29/05/2014, 19:55
 
Fecha de Ingreso: mayo-2014
Mensajes: 2
Antigüedad: 9 años, 10 meses
Puntos: 0
Pregunta Contar combinaciones de letras en un string c#

Hola !! estoy buscando ayuda porque necesito un algoritmo que me permita contar la cantidad de combinaciones de pares de letras de un string y luego pasarlos a una matriz .

ejemplo : "hola lola"

combinaciones : ho = 1
la = 2
ol = 2 ,etc.

matriz : la cantidad de columnas y filas debe ser igual que el total de caracteres de la cadena

agradezco sus aportes
  #2 (permalink)  
Antiguo 31/05/2014, 16:50
 
Fecha de Ingreso: mayo-2013
Ubicación: Chaco, Argentina
Mensajes: 45
Antigüedad: 10 años, 11 meses
Puntos: 3
Sonrisa Respuesta: Contar combinaciones de letras en un string c#

Hola alpranzetti, antes de solucionar el problema hay que corregir el enunciado, ya que es incorrecto decir que la cantidad de columnas y filas debe ser igual que el total de caracteres de la cadena, ya que en la misma se repiten varios de ellos. Si nos fijamos bien, no es lógico ni práctico intentar eso. Cuando se plantean este tipo de problemas, somos los programadores los que debemos determinar las dimensiones de la matriz, siguiendo los criterios de eficiencia y eficacia; por lo tanto está mal tratar de imponerle al programador un camino equivocado, y a la vez totalmente inapropiado, ya que si hiciéramos caso de ese enunciado se complicaría por demás la solución del problema, incluso talvez no se halle solución, lo que es peor.
Entonces, pensemos cuántas filas y columnas tendrá la matriz. En este caso como son pares de letras resulta sencillo, ya que podemos asignarle una letra a la fila y otra a la columna; por lo tanto primero debemos determinar cuántos caracteres DISTINTOS tiene la cadena y ésa será la dimensión para las filas y para las columnas:
Código C#:
Ver original
  1. private void Form1_Load(object sender, EventArgs e)
  2.         {
  3.             string s = "hola lola";
  4.  
  5.             // Declaramos la lista de caracteres
  6.             List<char> Lista = new List<char>();
  7.  
  8.             /* Recorremos la cadena en busca de todos los caracteres distintos
  9.                y los agregamos a la lista, a medida que los vayamos encontrando */
  10.             foreach (char ch in s)
  11.             {
  12.                 if (Lista.Contains(ch)) continue;
  13.                 Lista.Add(ch);
  14.             }
  15.  
  16.             /* Ahora ya sabemos cuáles deben ser los límites de la matriz,
  17.                por lo tanto procedemos a declararla */
  18.             int d = Lista.Count;
  19.             int[,] matriz = new int[d, d];
  20.  
  21.             // Ahora que ya tenemos la matriz, podemos buscar los pares de letras
  22.             for (int i = 0; i < (s.Length - 1); i++)
  23.             {
  24.                 /* Buscamos en la Lista cada carecter del par de caracteres;
  25.                    la posición dentro de la Lista corresponde tanto a la fila como a la columna */
  26.                 int p1 = Lista.IndexOf(s[i]);
  27.                 int p2 = Lista.IndexOf(s[i + 1]);
  28.                 matriz[p1, p2]++;
  29.             }
  30.  
  31.             // Mostramos el resultado
  32.             this.textBox1.Text = s + "\r\n";
  33.             for (int fila = 0; fila < d; fila++)
  34.                 for (int columna = 0; columna < d; columna++)
  35.                 {
  36.                     int m = matriz[fila, columna];
  37.                     if (m != 0)
  38.                         this.textBox1.Text += string.Concat(Lista[fila], Lista[columna], "\t = ", m.ToString(), "\r\n");
  39.                 }
  40.  
  41.         }
Para el código anterior utilizo un TextBox multilínea para mostrar los resultados.

¡Saludos desde Argentina!
  #3 (permalink)  
Antiguo 02/06/2014, 22:13
 
Fecha de Ingreso: mayo-2014
Mensajes: 2
Antigüedad: 9 años, 10 meses
Puntos: 0
Respuesta: Contar combinaciones de letras en un string c#

Muchisimas gracias!!! La verdad tu explicacion fue inmejorable y me funcionó todo perfecto. Te nolesto con otra cosita?por ahi es Una bobada lo que te voy a consultar pero hace muy poco que programo y no estoy nada canchera en el tema de matricez y arrays.
Como harias para sumar las ocurrencias de las combinaciones que empiezan con una determinada letra y meterlas en un vector para su posterior uso.es decir: vector sumas = primer elemento: 3 [ab=1+ac=2]
Segundo elemento: 1 [ba=1]
Y asi con cada letra q aparezca primero en la combinacion.

Mil gracias de nuevo,disculpa la molestia y saludos yo tambien soy de argentina,de rosario!!
  #4 (permalink)  
Antiguo 03/06/2014, 05:36
Avatar de Malenko
Moderador
 
Fecha de Ingreso: enero-2008
Mensajes: 5.323
Antigüedad: 16 años, 3 meses
Puntos: 606
Respuesta: Contar combinaciones de letras en un string c#

En este caso lo mejor es usar un diccionario de .NET del tipo Dictionary<string, int>, de forma que puedas acceder meditante el texto al diccionario, y mantener un contador. Te paso una página con algunos ejemplos sencillos:

http://www.dotnetperls.com/dictionary
__________________
Aviso: No se resuelven dudas por MP!
  #5 (permalink)  
Antiguo 05/06/2014, 22:28
 
Fecha de Ingreso: mayo-2013
Ubicación: Chaco, Argentina
Mensajes: 45
Antigüedad: 10 años, 11 meses
Puntos: 3
De acuerdo Respuesta: Contar combinaciones de letras en un string c#

Cita:
Iniciado por alpranzetti Ver Mensaje
Muchisimas gracias!!! La verdad tu explicacion fue inmejorable y me funcionó todo perfecto. Te nolesto con otra cosita?por ahi es Una bobada lo que te voy a consultar pero hace muy poco que programo y no estoy nada canchera en el tema de matricez y arrays.
Como harias para sumar las ocurrencias de las combinaciones que empiezan con una determinada letra y meterlas en un vector para su posterior uso.es decir: vector sumas = primer elemento: 3 [ab=1+ac=2]
Segundo elemento: 1 [ba=1]
Y asi con cada letra q aparezca primero en la combinacion.

Mil gracias de nuevo,disculpa la molestia y saludos yo tambien soy de argentina,de rosario!!
Hola alpranzetti, cuanto me alegra que te haya funcionado!!! Te aclaro que no es ninguna molestia sino todo lo contrario, es un placer poder ayudar siempre y cuando esté dentro de nuestras posibilidades.
Con respecto a la suma que mencionás usando un vector , podemos usar el mismo código anterior, agregándoles las líneas para la funcionalidad de dicho vector:
Código C#:
Ver original
  1. private void Form1_Load(object sender, EventArgs e)
  2.         {
  3.             string s = "hola lola";
  4.  
  5.             // Declaramos la lista de caracteres
  6.             List<char> Lista = new List<char>();
  7.  
  8.             /* Recorremos la cadena en busca de todos los caracteres distintos
  9.                y los agregamos a la lista, a medida que los vayamos encontrando */
  10.             foreach (char ch in s)
  11.             {
  12.                 if (Lista.Contains(ch)) continue;
  13.                 Lista.Add(ch);
  14.             }
  15.  
  16.             /* Ahora ya sabemos cuáles deben ser los límites de la matriz,
  17.                por lo tanto procedemos a declararla */
  18.             int d = Lista.Count;
  19.             int[,] matriz = new int[d, d];
  20.  
  21.             // Hacemos lo mismo para el vector
  22.             int[] vector = new int[d];
  23.  
  24.             // Ahora que ya tenemos la matriz, podemos buscar los pares de letras
  25.             for (int i = 0; i < (s.Length - 1); i++)
  26.             {
  27.                 /* Buscamos en la Lista cada carecter del par de caracteres;
  28.                    la posición dentro de la Lista corresponde tanto a la fila como a la columna */
  29.                 int p1 = Lista.IndexOf(s[i]);
  30.                 int p2 = Lista.IndexOf(s[i + 1]);
  31.                 matriz[p1, p2]++;
  32.  
  33.                 // Hacemos lo mismo con el vector
  34.                 vector[p1]++;
  35.             }
  36.  
  37.             // Mostramos el resultado
  38.             this.textBox1.Text = s + "\r\n";
  39.             for (int fila = 0; fila < d; fila++)
  40.             {
  41.                 // Mostramos el resultado del vector
  42.                 this.textBox2.Text += string.Concat(Lista[fila], "\t = ", vector[fila].ToString(), "\r\n");
  43.  
  44.                 // Mostramos el resultado de la matriz
  45.                 for (int columna = 0; columna < d; columna++)
  46.                 {
  47.                     int m = matriz[fila, columna];
  48.                     if (m != 0)
  49.                         this.textBox1.Text += string.Concat(Lista[fila], Lista[columna], "\t = ", m.ToString(), "\r\n");
  50.                 }
  51.             }
  52.         }
Como podés ver, las líneas que agregué son la 22, la 34 y la 42. Ten en cuenta que también tuve que agregar un nuevo TextBox, en este caso llamado TextBox2, para mostrar el resultado del vector.

Aprovecho este mensaje también para agradecerle a Malenko, muchas gracias! por la info aportada, en breve estaremos estudiando esta Clase de .Net llamada Dictionary, para ver cómo implementarla en esta solución.

Bueno alpranzetti, espero haberte ayudado , y cualquier duda que tengas, preguntá....

ahh qué linda ciudad Rosario! allí está el Monumento a Nuestra Amada, Bellísima y Honorable Bandera!,
la más linda del Mundo!...
¡Saludos desde Resistencia! ¡La Ciudad de las Esculturas!

Etiquetas: c#, string
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 18:23.