給定乙個經過編碼的字串,返回它解碼後的字串。
編碼規則為: k[encoded_string],表示其中方括號內部的 encoded_string 正好重複 k 次。注意 k 保證為正整數。
你可以認為輸入字串總是有效的;輸入字串中沒有額外的空格,且輸入的方括號總是符合格式要求的。
此外,你可以認為原始資料不包含數字,所有的數字只表示重複的次數 k ,例如不會出現像 3a 或 2[4] 的輸入。
示例:
s = "3[a]2[bc]", 返回 "aaabcbc".
s = "3[a2[c]]", 返回 "accaccacc".
s = "2[abc]3[cd]ef", 返回 "abcabccdcdcdef".
方法一
先得到2,然後遞迴進入第乙個中括號
得到4,遞迴進入
得到ab,遇到]
返回上一層
ab進行4次重複,遇到]
返回上一層
把得到的字串進行2次重複。然後繼續下一組。
對於第二個問題,很簡單,重新寫乙個方法來遞迴,然後加入position引數即可。第乙個問題有兩個思路:
全域性變數
在返回引數中加入
方法二有遞迴,那麼和遞迴一樣思路的是什麼?沒錯就是棧,那麼我們可以使用乙個輔助棧解決這個問題。思路和遞迴是差不多的:
遍歷字串陣列並把字元放進棧。
當遍歷到]
時進行回溯,把中距離棧頂第乙個[
前的字串拿出來
然後再遍歷數字,遇到棧底或者]
停止
然後進行迴圈運算後把字串放進棧中
最後返回棧中的字串
方法一
fun
decodestring
(s: string)
: string
fungetstrings
(s:string,i:int)
:stringarray
else
if(s[position]
in'0'
..'9'
)else
if(s[position]
=='[')}
else
if(s[position]
==']'
) position++
}val stringarray =
stringarray()
stringarray.
add(stringbuilder.
tostring()
) stringarray.
add(position.
tostring()
)return stringarray
}
方法二fun
decodestring
(s: string)
: string
stack.
pop(
)val string = stringbuilder.
reverse()
.tostring()
var num =
0var i =
0while
(stack.
isnotempty()
&& stack.
peek()
>=
'0'&& stack.
peek()
<=
'9')
for(j in
1..num)
}else stack.
add(c)
}val sb =
stringbuilder()
while
(stack.
isnotempty()
) sb.
reverse()
return sb.
tostring()
}
假如最終的字串長度為n,原字串的長度為k
方法一時間複雜度:遍歷原字串,還需要把新字元乙個個拼進來。
時間複雜度:o(n+k)空間複雜度:這裡所需要的空間是遞迴棧的深度,最壞情況下為k
空間複雜度:o(k)方法二
時間複雜度:除了遍歷一次原字串,還要把每個字元都放進棧中所以是
時間複雜度:o(n+k)空間複雜度:需要乙個棧來儲存資料,棧的長度為字串的長度
空間複雜度:o(n)
演算法題 字串解碼
1,給定乙個字串,目標是將寫在 和 之間的字串,重複 號前面的數字次數 數字只會是個位數 2,例如 輸入結果 strs he3 llo world 輸出結果 res hellollolloworld 輸入結果 strs he3 ll2 o wo rld 輸出結果 res helloowolloowo...
字串解碼
給定乙個經過編碼的字串,返回它解碼後的字串。編碼規則為 k encoded string 表示其中方括號內部的 encoded string 正好重複 k 次。注意 k 保證為正整數。你可以認為輸入字串總是有效的 輸入字串中沒有額外的空格,且輸入的方括號總是符合格式要求的。此外,你可以認為原始資料不...
字串解碼
題目描述 給定乙個經過編碼的字串,返回它解碼後的字串。編碼規則為 k encoded string 表示其中方括號內部的 encoded string 正好重複 k 次。注意 k 保證為正整數。你可以認為輸入字串總是有效的 輸入字串中沒有額外的空格,且輸入的方括號總是符合格式要求的。此外,你可以認為...