Ver Mensaje Individual
  #2 (permalink)  
Antiguo 31/05/2014, 16:50
javidotnet
 
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!