Tienes respuestas sobre cómo hacerlo, aquí es por qué su camino no funciona.
En primer lugar, intuitivamente, usted tuvo una buena idea: comience con el primer carácter de la cadena, cuéntelo (olvidó incluir el código de conteo), elimine todas las ocurrencias del mismo carácter en la cadena. La idea es ineficiente, pero funcionaría. Usted se metió en problemas con este trozo de código:
For i:=1 to (length(s)) do
begin
If (c=s[i]) then
begin
delete(s,i,1);
end;
end;
El problema es, Pascal tomará el valor Length(s)
cuando se establece el bucle, pero su código cambia la longitud de la cadena mediante la eliminación de caracteres (utilizando delete(s,i,1)
) . Terminarás viendo mala memoria. El problema secundario es que i
va a avanzar, no importa si coincide y elimina un char o no. Aquí está por qué eso es malo.
Index: 12345
String: aabbb
vas a probar para i = 1,2,3,4,5, en busca de a
.Cuando se i
1 encontrará una coincidencia, retire el primer carácter, y la cadena va a tener este aspecto:
Index: 1234
String: abbb
Ahora está probando con i = 2, y no es una coincidencia, porque s [2] = b. Acabas de esquivar un a
, y dado a
va a permanecer en el conjunto una segunda ronda y hace que tu algoritmo cuente dos veces. El algoritmo "fijo" se parecería a esto:
i := 1;
while i <= Length(s) do
if (c=s[i]) then
Delete(s,i,1)
else
Inc(i);
Esto es diferente: En el ejemplo dado, si he encontrado un partido en 1
, el cursor no avanza, por lo que ve a la segunda a
. Además, porque estoy usando un bucle while
, no un bucle for
, no me puedo meter en problemas con los posibles detalles de implementación del bucle for.
Su algoritmo tiene otro problema. Después del ciclo que elimina todas las apariciones del primer carácter en cadena, está preparando el siguiente ciclo utilizando este código:
c: = s [1];
El problema es que si usted alimenta a este algoritmo de una cadena de la forma aa
(longitud = 2, dos caracteres idénticos), que va a entrar en la serie, borrar o apariciones de a
(los que cumplen s en una cadena vacía) y luego intente leer el primer carácter de la cadena VACÍA.
Una última palabra: su algoritmo debe manejar la cadena vacía en la entrada, devolviendo un conteo = 0. Aquí está el algoritmo fijo:
var s:string;
i,count:integer;
c:char;
begin
Readln(s);
count:=0;
while Length(s) > 0 do
begin
Inc(Count);
c := s[1];
i := 1;
while i <= Length(s) do
begin
If (c=s[i]) then
delete(s,i,1)
else
Inc(i);
end;
end;
Writeln(Count);
Readln;
end.
he añadido la etiqueta de Delphi también. De esta manera, obtendrá * mucho * más atención a su pregunta. Y, después de todo, Delphi y Pascal son casi lo mismo para algoritmos simples como este. –
+1 para publicar el código que estás intentando que no funcionó. Parece que probablemente también deberías agregar la etiqueta de la tarea. –
Simplemente curioso: ¿deberes? –