算法練習之字符串解碼(PHP騰訊後臺面試題之一)

算法練習之解碼(PHP騰訊後臺面試題之一)

小Q想要給他的朋友發送一個神祕字符串,但是他發現字符串的過於長了,於是小Q發明了一種壓縮算法對字符串中重複的部分進行了壓縮,對於字符串中連續的m個相同字符串S將會壓縮爲 [m|S] (m爲一個整數且1<=m<=100),例如字符串ABCABCABC將會被壓縮爲[3|ABC],現在小Q的同學收到了小Q發送過來的字符串,你能幫助他進行解壓縮麼?

輸入第一行包含一個字符串s,代表壓縮後的字符串。
S的長度<=1000;
S僅包含大寫字母、[、]、|;
解壓後的字符串長度不超過100000;
壓縮遞歸層數不超過10層;

  1. 輸入樣例 HG[3|B[2|CA]]F
  2. 輸出樣例 HGBCACABCACABCACAF

思路

*主要是利用遞歸思想,找到最內層的[]進行分解替換字符串進行,直到最後面沒有|則代表解碼完成,從內到外層層進行解碼,最終完成。

實現代碼

function encode($str)
{

    while (strripos($str, '|')) {
        $left_index = strripos($str, '[');
        $right_index = stripos($str, ']', $left_index);
        $son_str = substr($str, $left_index, $right_index - $left_index + 1);
        $sub_son_str = rtrim(ltrim($son_str, '['), ']');//切割[]的子字符串
        $data = explode('|', $sub_son_str);
        $temp = '';
        for ($i = 1; $i <= $data[0]; $i++) {
            $temp .= $data[1];
        }
        $str = substr_replace($str, $temp, $left_index, $right_index - $left_index + 1);
    }
    return $str;
}

總結

因爲剛開始練習算法,實現的思路以及邏輯都是很直白,但還是比較通俗易懂。如果有比較更加巧妙實現的方法歡迎各位大神指點。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章