百度的一道二面算法題分析:補全括號序列
阿新 • • 發佈:2018-04-22
subst 地址 block lock sub amp 循環 imp not
算法題:補全括號序列
百度二面遇到的一個問題
大概意思就是
給出一個中括號序列,在序列前後可以加中括號字符,補全它。。。
當時沒想起來解決辦法,然後涼涼了,後來專門去搞了這道題,終於搞定
思路在註釋裏寫的比較詳細了,此處不再贅述(用了類似棧的思想)
<?php
/**
* 字符串轉數組
* @param $str string 輸入的字符串
* @return array 轉換之後的結果數組
*/
function strToArray($str) {
// 強制轉換為字符串
$str = (string)$str;
$arr = [];
// 計算長度,考慮中文
$len = mb_strlen($str);
// 循環截取,放到數組中
for ($i = 0; $i < $len; ++$i) {
$arr[] = mb_substr($str, $i, 1);
}
return $arr;
}
/**
* 判斷括號是否已匹配
* @param $str string 輸入的括號序列
* @return array 返回結果[bool,簡化之後的括號數組]
*/
function bracketsTest($str) {
$ls = strToArray($str);
$sp = 0; // StackPointer 把數組想象成一個棧,只在棧尾操作
if (strlen($str) == 0) {
return [true, []];
} else if (strlen($str) == 1) {
return [false, $ls];
}
while ($sp + 1 < count($ls)) {
// 如果棧尾的字符和下一個入棧字符匹配
if ($ls[$sp] == '[' && $ls[$sp + 1] == ']') {
// 刪除這兩個字符
array_splice($ls, $sp, 2);
if ($sp > 0) {
// 棧尾指針前移1位
--$sp;
}
} else {
// 入棧
++$sp;
}
}
if (count($ls) == 0) {
return [true, []];
} else {
echo implode($ls), "\n";
return [false, $ls];
}
}
/**
* 補全括號序列
* @param $str string 待補全的括號序列
* @return string
*/
function completingBrackets($str) {
// 先判斷,得到判斷結果和簡化結果
$testRes = bracketsTest($str);
if ($testRes[0]) {
return $str;
}
// 左右需補全的字符串
$lC = $rC = '';
foreach ($testRes[1] as $b) {
if ($b == '[') {
$rC .= ']';
} else {
$lC .= '[';
}
}
// 拼合
return $lC . $str . $rC;
}
echo completingBrackets('][][');
當時二面的時候沒想起來解法,後來冷靜分析一下其實不太難
我的文章倉庫:Github地址 https://github.com/JeffreyWxj/MarkdownNote
本文地址:https://github.com/JeffreyWxj/MarkdownNote/blob/master/Coding%E7%AC%94%E8%AE%B0/%E7%AE%97%E6%B3%95%EF%BC%9A%E6%8B%AC%E5%8F%B7%E5%BA%8F%E5%88%97%E8%A1%A5%E5%85%A8.md
轉載請註明出處
百度的一道二面算法題分析:補全括號序列