題目
概述:給定一個字符串,將其編碼成另一個字符串,編碼規(guī)則:字母不變,數字則將當前已經編碼的字符串重復(數字大小-1)次。給定一個索引,輸出編碼后字符串對應索引的字符
-
輸入:
- 字符串,長度范圍[2, 100],由字母開頭,且僅由小寫英文字母和數字2~9組成
- 索引,大小范圍[1, 10^9]
解碼后的字符串長度不會超過2^63
輸出:編碼后字符串指定索引處的字符
出處:https://leetcode-cn.com/problems/decoded-string-at-index/
思路
- 遍歷字符串,記錄當前字符串編碼后字符串的長度,并記錄當前編碼后字符串長度到當前字符的映射,如果當前字符是數字,則這次映射的字符與上一次相同
- 當遍歷到當前字符串的長度大于等于索引時,重新計算索引=(索引-上一次字符串長度)% 上一次字符串長度(索引等于0時應加上上一次字符串長度),重新遍歷字符串直至當前字符串的長度等于索引
- 根據最終計算的索引從一開始記錄的映射表中取出對應字符
代碼
class Solution {
public String decodeAtIndex(String S, int K) {
char[] sArray = S.toCharArray();
Map<Long, Character> map = new HashMap<>();
long ind = K;
long len, lastLen;
boolean isFirst = true;
while (true) {
len = 0L;
lastLen = 0L;
for (int i = 0; ;++i) {
if (sArray[i] >= 'a' && sArray[i] <= 'z') {
++len;
if (isFirst) {
map.put(len, sArray[i]);
}
} else {
len *= (sArray[i] - '0');
if (isFirst) {
map.put(len, map.get(lastLen));
}
}
// check len before forward lastLen
if (len >= ind) {
break;
}
lastLen = len;
}
if (len == ind) {
return "" + map.get(len);
}
ind = (ind - lastLen) % lastLen;
if (ind == 0) {
return "" + map.get(lastLen);
}
isFirst = false;
}
}
}