算法練習之解碼(PHP騰訊後臺面試題之一)
小Q想要給他的朋友發送一個神祕字符串,但是他發現字符串的過於長了,於是小Q發明了一種壓縮算法對字符串中重複的部分進行了壓縮,對於字符串中連續的m個相同字符串S將會壓縮爲 [m|S] (m爲一個整數且1<=m<=100),例如字符串ABCABCABC將會被壓縮爲[3|ABC],現在小Q的同學收到了小Q發送過來的字符串,你能幫助他進行解壓縮麼?
輸入第一行包含一個字符串s,代表壓縮後的字符串。
S的長度<=1000;
S僅包含大寫字母、[、]、|;
解壓後的字符串長度不超過100000;
壓縮遞歸層數不超過10層;
- 輸入樣例 HG[3|B[2|CA]]F
- 輸出樣例 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;
}
總結
因爲剛開始練習算法,實現的思路以及邏輯都是很直白,但還是比較通俗易懂。如果有比較更加巧妙實現的方法歡迎各位大神指點。