百度的一道二面算法題分析:補全括號序列

算法題:補全括號序列

百度二面遇到的一個問題php

大概意思就是git

給出一箇中括號序列,在序列先後能夠加中括號字符,補全它。。。github

當時沒想起來解決辦法,而後涼涼了,後來專門去搞了這道題,終於搞定算法

思路在註釋裏寫的比較詳細了,此處再也不贅述(用了相似棧的思想)數組

<?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.mdcode

轉載請註明出處字符串

相關文章
相關標籤/搜索