《leetcode-php》给出头尾和字典,求拼接的最短路径
作者:互联网
Given two words (start and end), and a dictionary, find all shortest transformation sequence(s) from start to end, such that:
- Only one letter can be changed at a time
- Each intermediate word must exist in the dictionary
For example,
Given:
start ="hit"
end ="cog"
dict =["hot","dot","dog","lot","log"]
Return
[
["hit","hot","dot","dog","cog"],
["hit","hot","lot","log","cog"]
]
Note:
- All words have the same length.
- All words contain only lowercase alphabetic characters.
给出了一个开始和一个结束,还有一个数组,每次变更一个字母,用数组中的词把首尾链接起来,吐出最短的列表。
使用递归遍历也不是很麻烦
<?php
function findLadders($arrWord, $startWord, $stopWord, &$arrRet, &$arrTmp) {
if (empty($arrWord) && !onlyOneStr($startWord, $stopWord)) {
return;
}
array_push($arrTmp, $startWord);
if (onlyOneStr($startWord, $stopWord)) {
array_push($arrTmp, $stopWord);
print '接上了'.$startWord.$stopWord."\n";
$arrRet[] = $arrTmp;
array_pop($arrTmp);
}
foreach ($arrWord as $key => $item) {
//如果可以和开始匹配上,则更新开始继续往下找
if (onlyOneStr($item, $startWord)) {
unset($arrWord[$key]);
$arrNewWord = $arrWord;
findLadders($arrNewWord, $item, $stopWord, $arrRet, $arrTmp);
$arrWord[$key] = $item;
}
}
array_pop($arrTmp);
}
function onlyOneStr($word1, $word2) {
$noEqualNum = 0;
$num = strlen($word1);
for ($i = 0; $i < $num; $i ++) {
if ($word1[$i] !== $word2[$i]) {
$noEqualNum ++;
}
}
if ($noEqualNum == 1) {
return true;
} else {
return false;
}
}
$arrWord = ["hot","dot","dog","lot","log"];
$startWord = "hit";
$stopWord = "cog";
$arrRet = array();
$arrTmp = array();
findLadders($arrWord, $startWord, $stopWord, $arrRet, $arrTmp);
foreach ($arrRet as $key => $item) {
$num = count($item);
$arrIndex[$num][] = $key;
if (!isset($minNum)) {
$minNum = $num;
continue;
}
if ($minNum > $num) {
$minNum = $num;
}
}
foreach ($arrIndex[$minNum] as $item) {
$arrOutput[] = $arrRet[$item];
}
print json_encode($arrOutput);
标签:头尾,arrWord,hit,arrRet,item,minNum,num,php,leetcode 来源: https://blog.csdn.net/less_cold/article/details/98884663