Autor Tema: comparar 2 string para ver si son anagramas  (Leído 587 veces)

Desconectado rllancafil

  • PHPerit@
  • *
  • Mensajes: 1
  • Karma: 0
  • Nuev@ PHPer@
    • Ver Perfil
comparar 2 string para ver si son anagramas
« en: 23 de Octubre de 2015, 18:12:18 pm »
Buenas Tardes, soy nuevo aqui y en php; he estado toda la noche y esta mañana leyendo sobre cómo hacer este asunto:
el usuario me ingresa 2 palabras, y luego comparar si éstas son anagramas.
lo que hice primero fue contar sus letras, si la cantidad no coincide de plano se termina el proceso ya que no es anagrama.
si es de la misma longitud, se comienza a comparar. Quiero, mediante un ciclo for, recorrer la cadena e insertar una coma entre cada letra, luego almacenar esa salida en una variable y convertirla en un arreglo mediante explode, luego hacer un sort, volverla a convertir en string con implode, comparar ambas string nuevas con la funcion similar_text($a, $b, $percent) y si el $percent=100 entonces es anagrama, sino, no es anagrama.
realmente nunca he programado en php ni en nada, no sé si es posible hacer esto o hay otra manera mas eficiente. mi codigo que he usado es el siguiente:
Código: [Seleccionar]
<html>
<head>
<title>Numeros</title>
</head>
<body background=''>
<form method="POST" action="anagrama.php">
Introduce palabras <br><br>
Primera palabra  :
<input type="text" name="palabra1" placeholder=" Palabra 1 ">
<br>
Segunda palabra  :
<input type="text" name="palabra2" placeholder=" Palabra 2 ">
<br>
<input type="submit" name="enviar" value="Enviar">
</form>
<?php

$a 
$_POST["palabra1"];
$b $_POST["palabra2"];
if (
strlen($a)!= strlen($b)){
echo "son palabras distintas!";
}else{

for($i=0;i<strlen($a);$i++){
$a1=$a;
}
for($i=0;i<strlen($b);$i++){
$b1=$b;
}
$array1explode(",",$a1);
$array2explode(",",$b1);
$orden1sort($array1);
$orden2sort($array2);
$ximplode(",",$orden1);
$yimplode(","$orden2);
similar_text($x$y$percent);

if ($percent=100){
echo "son anagramas!";
}else{
echo "no son anagramas!";
}

}
?>

</html>

espero se entienda y me puedan dar alguna sugerencia o idea. Muchas gracias de antemano.

Comunidad PHPeros

comparar 2 string para ver si son anagramas
« en: 23 de Octubre de 2015, 18:12:18 pm »

Desconectado FeDe

  • PHPero Avanzado
  • ****
  • Mensajes: 448
  • Karma: 35
  • Sexo: Masculino
  • BaDyDj -> ¡Mi Stylo, Mi ViDa!
    • Ver Perfil
Re:comparar 2 string para ver si son anagramas
« Respuesta #1 en: 28 de Noviembre de 2015, 02:37:41 am »
Hola,

Me he tomado la libertad de hacer un pequeño script de 0 y está preparado para trabajar desde PHP CLI con los dos primeros parametros pasado por argumento $argv[1] y $argv[2] (obviamos $argv[0] que es el nombre del fichero). Les he dado el valor $first y $second (como primera y segunda palabra) para que puedas modificarlo fácilmente a un $_POST.
Es bastante más simple de lo que estabas planteando, te resumo un poco lo que realiza este pequeño script:

  • Primero:
    Comprueba si la longitud de los strings son lo mismo
  • Segundo:
    Convierte las cadenas en array (cada letra es un valor).
  • Tercero:
    Hacemos un sort para ordenar alfabéticamente ambos arrays.
  • Cuarto:
    Recorremos todos los valores del primer array y comparamos con el segundo array llamando a su valor correspondiente mediante el key del primer array. (al haber comprobado la longitud del ambas strings siempre vamos a tener los mismos valores para el primer array como para el segundo). Para cada valor del array recorrido comprobamos si las letras del primer y segundo array son diferentes, si es así retornamos falso sino, continuamos con el siguiente valor. Al finalizar devolvemos true, así, en caso de que no haya sido falso devolverá verdadero.
  • Quinto:
    Mostramos al usuario un mensaje tras haber hecho la comprobación.

Aquí el código:

<?php

	
$first $argv[1];
	
$second $argv[2];

	
function 
str2array($str) {
	
	
$tmp = [];
	
	
for(
$i=0;$i<strlen($str);$i++) {
	
	
	
$tmp[] = $str[$i];
	
	
}
	
	
return 
$tmp;
	
}
	
function 
compareArrayValues($origin$tocompare) {
	
	
foreach(
$origin as $k=>$v) {
	
	
	
$v2 $tocompare[$k];
	
	
	
if(
$v != $v2) return false;
	
	
}
	
	
return 
true;

	
}

	
if(
strlen($first) != strlen($second)) {
	
	
throw new 
ErrorException("Las palabras no coinciden en longitud.");
	
} else {
	
	

	
	
$s_first str2array($first);
	
	
sort($s_first);
	
	
$s_second str2array($second);
	
	
sort($s_second);

	
	
if(
compareArrayValues($s_first,$s_second)) {
	
	
	
echo 
"Sí, son anagramas.";
	
	
} else echo 
"No, no son anagramas";

	
}
	
echo 
PHP_EOL;

?>
Sin Firma me haces una? :P

Desconectado zetaceo

  • PHPerit@
  • *
  • Mensajes: 1
  • Karma: 0
  • Nuev@ PHPer@
    • Ver Perfil
Re:comparar 2 string para ver si son anagramas
« Respuesta #2 en: 30 de Noviembre de 2015, 19:11:56 pm »
Estimado, me quedó una duda, disculpando mi ignorancia pero en que momento el usuario indica cuales son las palabras a comparar?

Saludos,
GFS