标签:头尾 arrWord hit arrRet item minNum num php leetcode
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
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。