原题:http://hero.pongo.cn/Question/Details?ID=57&ExamID=55
无意中看到这个题,最近PHP用的比较多,就用PHP写了一个,当然这个还不完全,只需要从所有路径中求出最短的就可以了
测试例子:
$a = 'hit';
$b = 'cog';
$dict = array("hot","dot","dog","lot","log");
$change[0] = $a;
getChange($change, $b, $dict, 0);
使用回溯法求解,遍历所有可能的情况,其中change()函数的作用是判断两个字符串是否可以改变一个字符而相互转换。
<?php
/**
* 获取所有可行转化路径
* @param array $change 保存转化路径
* @param String $b 目标字符串
* @param array $dict 词典
* @param int $i
*/
function getChange($change, $b, $dict, $i)
{
if ($change[$i] === $b)
{
echo 0 . ' : ' . $b;
}
if (change($change[$i], $b))
{
echo $i.' : ';
for ($j = 0; $j <= $i; $j++)
{
echo $change[$j];
if ($j <= $i)
{
echo '=>';
}
}
echo $b . '<br />';
return;
}
for ($k = 0; $k < count($dict); $k++)
{
for ($j = 0; $j <= $i; $j++)
{
if ($change[$j] == $dict[$k])
{
break;
}
}
if ($j > $i)
{
if (change($change[$i], $dict[$k]))
{
$change[$i + 1] = $dict[$k];
getChange($change, $b, $dict, $i + 1);
}
}
}
}
/**
* 比较两个字符串是否只相差一个字符
* @param String $a
* @param String $b
*/
function change($a, $b)
{
if (strlen($a) != strlen($b))
{
return false;
}
$count = 0;
for ($i = 0; ($i < strlen($a)) && ($count <= 1); $i++)
{
if ($a[$i] != $b[$i])
{
$count++;
}
}
if ($count > 1)
{
return false;
}
return true;
}
?>